正在初始化带模式的“constexpr”数组

Initializing `constexpr` Array with Pattern

本文关键字:constexpr 数组 模式 初始化      更新时间:2023-10-16

我想用使用可变模板参数生成的模式初始化constexpr数组。为了简单起见,请考虑使用类型列表(例如unsigned, short, char, int, long)的大小初始化constexpr unsigned静态数组的问题。我如何做到这一点,以便所有的计算都在编译时完成我需要这个解决方案来处理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;
}

非常感谢您抽出时间!

下面是答案。请记住,由于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;
}