4

我目前正在做一些工作,我想将尽可能多的代码抽象成一个简单的 api。基本上我想写这样的东西:

int main()
{
    Server server;

    server.get<"/hello">([] { std::cout << "hello" << std::endl; });
    server.get<"/goodbye">([] { std::cout << "goodbye" << std::endl; });

    server.listen();
}

并让它在编译时创建必要的正则表达式(使用 CTRE)。

但是,当我需要匹配这些正则表达式时,我需要有一个它们的列表,以便我可以遍历它们并检查每一个。这已被证明是非常困难的。我尝试过的一件事是创建这样的东西:

template<typename Contained>
class Container {
public:

    constexpr Container() = default;
    ~Container() = default;

    constexpr void add(Contained&& item) { m_temp_container.push_back(item); }

    constexpr size_t arr_size() const {
        size_t a = 64;
        while(true)
        {
            if (size() > a) a+=64;
            else break; 
        }
        return a;
    }

    constexpr auto array() const {
        constexpr size_t s = arr_size();
        std::array<Contained, s> array;
        for(int i = 0; i < size(); i++)
            array[i] = std::move(m_temp_container[i]);
        return array;
    }

    constexpr size_t size() const { return m_temp_container.size(); }

    std::vector<Contained> m_temp_container;

};

struct CString
{
    constexpr CString() : m_a(nullptr) {};
    constexpr CString(const char* a) : m_a(a) {}
    ~CString() = default;

    const char* m_a;
};

int main()
{

    Container<CString> container;

    container.add("hello");
    container.add("there");
    container.add("how");
    container.add("are you");

    const auto arr = container.array();
}

但是,编译器抱怨说

constexpr size_t s = arr_size();

不是常量表达式。

我不确定创建这样的列表是否可行,至少以我目前对标准库的了解是不可能的。

我可以通过让用户将处理程序作为一个完整的对象传递来做到这一点,也许可以这样做:

int main()
{
    constexpr auto get_handlers = {
        Handler<"/hello">([] {...} ),
        Handler<"/hello2">([] {...} )
    };

    Server server(get_handlers, ...);

    server.listen();
}

但我仍然想知道是否可以在编译时通过代码构造一个列表并循环遍历它,就好像它在运行时是一个 const 数组一样。

有任何想法吗?

4

0 回答 0