gpt4 book ai didi

c++ - 如何创建一个编译时静态类类型来初始化具有特定值的成员容器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:09 28 4
gpt4 key购买 nike

这基本上就是我想要的:

struct Item{
int id;
std::string s;
};

template <???>
struct StaticContainer
{
static const std::deque<Item> _items;
};

template <???>
const std::deque<Item> StaticContainer<>::_items {???};

不必是 deque,我只想将可迭代的值列表与 type 相关联。这样我就可以做类似的事情

typedef StaticContainer<{{1, "a", {2, "b"}, {3, "c"}}> T1;
typedef StaticContainer<{{0, "e"}, {-1, "f"}, {-2, "g"}}> T2;

int main() {
T1 t1;
T2 t2;
t1 = t2; // Error: incompatible types

return 0;
}

通常问题在于让事情变得动态,但显然让一些动态的事情成为编译时也同样困难。我不想使用继承、多态性和类似的运行时、开销诱导方法。

最佳答案

您不能拥有用户定义结构的编译时列表。而且你不能有任何类型的编译时 std::string 。它不是 literal type ,因此不能在任何 constexpr 上下文中使用。

如果您限制自己使用可以在 non-type template parameters 中使用的类型,那么您可以使用可变参数模板类型。然后,您不必为运行时容器操心:

template<typename T, T ...ts>
struct value_list
{
//Not the most efficient way to get a value.
template<int ix>
static constexpr auto get()
{ return std::get<ix>(std::make_tuple(ts...)); }

//Get a general container
template<typename Container>
static auto get_container() {return Container{ts...};}

//Get an array, appropriately sized.
static constexpr auto get_array()
{ return std::array<T, sizeof...(ts)>{ts...}; }

//Manipulators. Types are static, so they must return
//new types with the new values.
template<T new_val>
constexpr auto push_back()
{return value_list<T, ts..., new_val>();}

template<T new_val>
constexpr auto push_front()
{return value_list<T, new_val, ts...>();}
};

Live example .

但是,请注意,编译器对一个类型可以拥有的模板参数的数量有相当严格的限制。您可能不会通过在键盘上键入它们来突破此限制,但您可以构建它们来突破它。

关于c++ - 如何创建一个编译时静态类类型来初始化具有特定值的成员容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37897789/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com