我想初始化一个constexpr
数组,其中包含使用可变参数模板参数生成的模式。为简单起见,请考虑使用类型列表(例如constexpr unsigned
)的大小初始化unsigned, short, char, int, long
静态数组的问题。我怎么能这样做,以便所有的计算都是在编译期间完成的?我需要解决方案与C ++类型系统一起使用,所以我不能使用宏。
我能想到的最好的东西如下所示,但使用 并且工作正常。g++ -std=c++11 -Wall -Ofast -S
进行编译(使用g ++ 4.7)并且检查程序集清楚地显示在运行时期间值被压入堆栈。任何想法?
如果我能以某种方式告诉扩展 n + 1 关于扩展 n ,那么使用如下的数组初始化器将会起作用。
static constexpr unsigned foo[] = { compute_element<Args>::value... };
编辑:等等,没关系,我有一个脑力。上面的一行很好......
这是代码回答:
#include <iostream>
template <class... Args>
struct foo
{
static constexpr unsigned bar[] = { sizeof(Args)... };
};
int main()
{
std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
return 0;
}
非常感谢你的时间!
答案 0 :(得分:5)
这是答案。请记住,由于C ++的限制,我认为这只能在编译时完成,以创建与可变参数模板参数包大小相同的数组。
#include <iostream>
template <class... Args>
struct foo
{
static constexpr unsigned bar[] = { sizeof(Args)... };
};
int main()
{
std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
return 0;
}