C 11在constexpr函数中初始化具有统一值的数组

C 11在constexpr函数中初始化具有统一值的数组,第1张

概述我有一个类模板,它基于模板参数构建一个简单的数组作为其成员之一.我需要能够将数组中的每个元素初始化为其中一个构造函数中的单个值.不幸的是,这个构造函数必须是constexpr. 相关部分归结为: template <typename T, size_t N>class foo{ T data[N]; constexpr foo(T val) { // initialize 我有一个类模板,它基于模板参数构建一个简单的数组作为其成员之一.我需要能够将数组中的每个元素初始化为其中一个构造函数中的单个值.不幸的是,这个构造函数必须是constexpr.

相关部分归结为:

template <typename T,size_t N>class foo{  T data[N];  constexpr foo(T val)  {    // initialize data with N copIEs of val  }};

使用std :: fill或循环与constexpr要求不兼容.初始化:data {val}仅设置数组的第一个元素,并对剩余部分进行零初始化.

怎么能实现这一目标?

我觉得应该有一个可变参数模板和元组等的解决方案……

解决方法 非常奇怪的是,问题的解决方案存在于c 14中(在gcc上使用-std = c 1y编译示例;另请参阅Praetorian的更详细的c 11解决方案的注释):
template <size_t N>struct bar {    template <typename T,typename ...Tn>    static constexpr auto apply(T v,Tn ...vs)    {        return bar<N - 1>::apply(v,v,vs...);    }};template <>struct bar<1> {    template <typename T,Tn ...vs)    {        return std::array<T,sizeof...(vs) + 1>{v,vs...};    }};template <typename T,size_t N>struct foo {    std::array<T,N> data;    constexpr foo(T val)    : data(bar<N>::apply(val))    {}};

(我用std :: array替换了POD数组 – 假设它不会对你的用例造成任何问题).

现场示例如下:http://coliru.stacked-crooked.com/a/4731a10ee54563b9

总结

以上是内存溢出为你收集整理的C 11在constexpr函数中初始化具有统一值的数组全部内容,希望文章能够帮你解决C 11在constexpr函数中初始化具有统一值的数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存