开发者社区> 问答> 正文

如何使用std :: array模拟C数组初始化“ int arr [] = {e1,e2,e3,…

#include #include

template<class T, class... Tail, class Elem = typename std::decay ::type> std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values) { return { std::forward (head), std::forward (values)... }; }

// in code auto std_array = make_array(1,2,3,4,5); 并采用了各种很酷的C ++ 11东西:

可变参数模板 sizeof... 右值引用 完美的转发 std::array, 当然 统一初始化 通过统一初始化省略返回类型 类型推断(auto) 在这里可以找到一个例子。

但是,正如@Johannes在对@Xaade的答案的评论中指出的那样,您无法使用此类函数初始化嵌套类型。例:

struct A{ int a; int b; };

// C syntax A arr[] = { {1,2}, {3,4} }; // using std::array ??? std_array = { {1,2}, {3,4} }; 同样,初始化器的数量限于实现所支持的函数和模板参数的数量。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-07 01:06:25 448 0
1 条回答
写回答
取消 提交回答
  • 我能想到的最好的是:

    template<class T, class... Tail> auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)> { std::array<T, 1 + sizeof...(Tail)> a = { head, tail ... }; return a; }

    auto a = make_array(1, 2, 3); 但是,这要求编译器执行NRVO,然后还跳过返回值的副本(这也是合法的,但不是必需的)。实际上,我希望任何C ++编译器都能对其进行优化,使其与直接初始化一样快。

    2020-02-07 01:06:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载