(注意:这个问题是不必指定元素的数量,仍然允许直接初始化嵌套类型.)
这个问题讨论了C数组的用途int arr[20];.在他的回答中,@ James Kanze展示了C阵列的最后一个据点,它具有独特的初始化特性:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Run Code Online (Sandbox Code Playgroud)
我们没有必要指定元素的数量,万岁!现在遍历它与C++ 11的功能std::begin和std::end从<iterator>(或您自己的变体),你永远需要甚至认为它的大小.
现在,有没有(可能是TMP)方法实现同样的目标std::array?使用宏可以使它看起来更好.:)
??? std_array = { "here", "be", "elements" };
Run Code Online (Sandbox Code Playgroud)
编辑:中间版本,从各种答案编译,如下所示:
#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 …Run Code Online (Sandbox Code Playgroud) 假设我们有以下功能:
void someFunction(int * araye){
for (int i=0;i<5;i++)
cout <<araye[i]<<' ';
cout <<'\n';
}
Run Code Online (Sandbox Code Playgroud)
在即将到来的c ++ 0x标准下,我们可以通过以下语法将数组传递给此函数吗?:
someFunction({1,2,3,4,5});
Run Code Online (Sandbox Code Playgroud)
如果这是真的,我们甚至可以在任何情况下使用这种语法,其中数组元素来自如下的POD类型:
class Test{
int adad1;
int adad2;
};
void someFunction(Test * araye){
for (int i=0;i<3;i++)
cout <<araye[i].adad1<<'-'<<araye[i].adad2<<' ';
cout <<'\n';
}
someFunction({{1,2},{3,4},{5,6}});
Run Code Online (Sandbox Code Playgroud)
编辑 - >之后人们说:
所以你们告诉大括号之间的表达式基本上会被视为一个初始化器列表,并建议使用一个额外的函数将指针拉出初始化列表并将其传递给预期的函数,但是这个方法在我看来像是一个hack,能够使用我的预期函数与该表达式作为参数,据说我认为我不应该使用该表达式作为参数,当我的预期函数参数是单个指针时,或者可能有另一种方法来使用该表达式?.