(注意: 这个问题是关于不必指定元素的数量,但仍然允许直接初始化嵌套类型。)
这个问题 讨论了像 int arr[20];
这样的 C 数组的剩余用途。在 他的回答上,@James Kanze 展示了 C 数组的最后一个要点,它独特的初始化特性:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
我们不需要指定元素的数量,万岁!现在使用来自 <iterator>
(或者你自己的变种)的 C + + 11函数 std::begin
和 std::end
迭代它,您甚至不需要考虑它的大小。
现在,是否有任何(可能的 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...
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} };
此外,初始化器的数量限制为实现支持的函数和模板参数的数量。