猿问

如何模拟C数组初始化“int arr[]={e1,e2,E3,…}“行为与STD:数组?

如何模拟C数组初始化“int arr[]={e1,e2,E3,…}“行为与STD:数组?

它独特的初始化特性:


int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };

我们不需要指定元素的数量,万岁!现在用C+11函数迭代它std::beginstd::end从…<iterator> (或者你自己的变体你甚至不需要考虑它的大小。


现在,是否有任何方法(可能是TMP)来实现与std::array?使用宏可以使它看起来更好看。*)


??? std_array = { "here", "be", "elements" };

编辑*根据各种答案汇编的中间版本如下:


#include <array>

#include <utility>


template<class T, class... Tail, class Elem = typename std::decay<T>::type>

std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)

{

  return { std::forward<T>(head), std::forward<Tail>(values)... };

}


// in code

auto std_array = make_array(1,2,3,4,5);

并使用了所有酷C+11的东西:


可变模板

sizeof...

rvalue引用

完美转发

std::array当然,

均匀初始化

忽略具有一致初始化的返回类型

类型推断(auto)

可以找到一个例子这里.

不过,正在对@Xaade的答案的注释中指出的那样,您不能用这样的函数初始化嵌套类型。例子:


struct A{ int a; int b; };


// C syntax

A arr[] = { {1,2}, {3,4} };

// using std::array

??? std_array = { {1,2}, {3,4} };

此外,初始化器的数量仅限于实现支持的函数和模板参数的数量。


紫衣仙女
浏览 359回答 3
3回答

明月笑刀无情

我能想到的是:template<class&nbsp;T,&nbsp;class...&nbsp;Tail>auto&nbsp;make_array(T&nbsp;head,&nbsp;Tail...&nbsp;tail)&nbsp;->&nbsp;std::array<T,&nbsp;1&nbsp;+&nbsp;sizeof...(Tail)>{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::array<T,&nbsp;1&nbsp;+&nbsp;sizeof...(Tail)>&nbsp;a&nbsp;=&nbsp;{&nbsp;head,&nbsp;tail&nbsp;...&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a;}auto&nbsp;a&nbsp;=&nbsp;make_array(1,&nbsp;2,&nbsp;3);但是,这要求编译器执行NRVO,然后跳过返回值的副本(这也是合法的,但不是必需的)。实际上,我希望任何C+编译器都能对其进行优化,使其与直接初始化一样快。

慕斯王

我想要一个简单的make_array.template<typename&nbsp;ret,&nbsp;typename...&nbsp;T>&nbsp;std::array<ret,&nbsp;sizeof...(T)>&nbsp;make_array(T&&...&nbsp;refs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;std::array<ret,&nbsp;sizeof...(T)>{&nbsp;{&nbsp;std::forward<T>(refs)...&nbsp;}&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;{&nbsp;std::forward<T>(refs)...&nbsp;};}
随时随地看视频慕课网APP
我要回答