使用Pattern初始化`constexpr`数组

时间:2012-07-16 17:18:39

标签: c++ templates c++11 template-meta-programming constexpr

我想初始化一个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;
}

非常感谢你的时间!

1 个答案:

答案 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;
}
相关问题