2

我想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;
}

非常感谢您的宝贵时间!

4

1 回答 1

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;
}
于 2012-07-16T20:21:33.920 回答