使用Pattern初始化`constexpr`数组

voi*_*ter 2 c++ templates template-meta-programming constexpr c++11

我想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;
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的宝贵时间!

voi*_*ter 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;
}
Run Code Online (Sandbox Code Playgroud)