假设我们有以下功能:
void someFunction(int * araye){
for (int i=0;i<5;i++)
cout <<araye[i]<<' ';
cout <<'\n';
}
我们可以在即将到来的c ++ 0x标准下通过以下语法将数组传递给此函数吗? :
someFunction({1,2,3,4,5});
如果这是真的,我们甚至可以在任何情况下使用这种语法,其中数组元素来自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}});
编辑 - >之后人们说:
所以你们要告诉大括号之间的表达式基本上会被视为initializer_list,并建议使用一个额外的函数将指针从该initializer_list中拉出来并将其传递给预期的函数,但这种方法在我看来就像是一个hack to能够使用我的预期函数与该表达式作为参数,据说我认为我不应该使用该表达式作为参数,当我的预期函数参数是单个指针,或者可能有另一种方法使用那表达? 。
如果您的功能需要 const int*
, 而不是 int*
,那么你只需要一个小蹦床功能来拉出指针 std::initializer_list<int>
支撑初始化器产生的。像这样的东西(可能;我没有要测试的C ++ 0x编译器)
void someFunction(const int * array){
for (int i=0; i<5; i++)
std::cout << array[i] << ' ';
std::cout << '\n';
}
void someFunction(const std::initializer_list<int>& init) {
someFunction(init.begin());
}
someFunction({1,2,3,4,5});
如果你的函数需要知道数组的结束或大小(通常是这种情况),那么通过它们 init.end()
要么 init.size()
作为第二个论点。
表达式的类型 {1,2,3,4,5}
是 std::initializer_list<int>
。它是一个具有成员函数的对象 size()
, begin()
, end()
, 但不是 operator[]
(每 18.9/1
C ++ 0x FCD)
如果你的函数使用std :: vector或任何其他标准容器,这将起作用,因为容器可以从initializer_lists构造(它们都提供了非显式的构造函数):
void someFunction(std::vector<int> araye)
{
for (int i=0;i<5;i++)
std::cout << araye[i] <<' ';
std::cout <<'\n';
}
int main()
{
someFunction({1,2,3,4,5});
}
如果你想拥有一个带指针的函数,你需要以某种方式手动将initializer_list转换为你可以以这种方式访问的东西:
void someFunction(int* araye)
{
for (int i=0;i<5;i++)
std::cout << araye[i] <<' ';
std::cout <<'\n';
}
void someFunction(std::vector<int> v)
{
someFunction(&v[0]);
}
int main()
{
someFunction({1,2,3,4,5});
}
维基百科 似乎建议你可以做到这一点,但只能通过声明函数来获取 std::initializer_list<int>
作为一个论点。