【问题标题】:Initializing `constexpr` Array with Pattern用 Pattern 初始化 `constexpr` 数组
【发布时间】:2012-07-16 17:18:39
【问题描述】:

我想用使用可变参数模板参数生成的模式初始化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++ templates c++11 template-meta-programming constexpr


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-11-10
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多