【发布时间】:2011-08-28 22:35:33
【问题描述】:
stackoverflow 上有一个答案(我似乎再也找不到了),它演示了如何在 C++11 中使用可变参数模板在编译时创建静态数组:
template <class T, T... args>
struct array_
{
static const T data[sizeof...(args)];
};
template <class T, T... args>
const T array_<T, args...>::data[sizeof...(args)] = { args... };
可以提供递归元函数来实例化具有任意数量参数的array_,然后在编译时将其复制到内部数组中。这是一种在编译时创建用于生成常量数组的元函数的有用方法。
然而,一个问题是它依赖于类模板参数来获取实际值来填充数组。这导致了一个主要限制:只有整数常量可以用作值模板参数。因此,您不能使用这种技术来生成自定义类型的数组。
我试图想办法解决这个限制,但想不出任何办法。有什么方法可以使这种技术适用于非整数常量?
【问题讨论】:
-
一个 std::string 可能在内部有一个动态内存分配。你会如何在编译时做到这一点? :-)
-
@Bo,是的,std::string 是一个不好的例子。但是自定义 POD 结构呢?
-
我相信这是问题中提到的link。
-
看我的问题,有一个很好的答案:stackoverflow.com/a/20388055/293195
-
@BoPersson 不可能创建编译时字符串,但可以创建编译时 c-string 并在运行时将其转换为字符串(或者,如果使用 c++17,则转换为 string_view in编译时也是)。 Here 您可以找到该技术的示例用法以及一些相关的元功能。
标签: c++ templates c++11 variadic-templates