繁体   English   中英

用Pattern初始化`constexpr`数组

[英]Initializing `constexpr` Array with Pattern

我想使用使用可变参数模板参数生成的模式来初始化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;
}

非常感谢您的宝贵时间!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM