假设我们有以下功能:
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}});
编辑 - &gt;之后人们说:
所以你们告诉我们,大括号之间的表达式基本上会被视为一个初始化器列表,并建议使用一个额外的函数将指针拉出初始化列表并将其传递给预期的函数,但这种方法在我看来就像是一个hack to能够使用我的预期函数与该表达式作为参数,说我认为我不应该使用该表达式作为参数,当我的预期函数参数是单个指针,或者可能有另一种方法使用那表达?
答案 0 :(得分:5)
表达式{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});
}
答案 1 :(得分:4)
如果你的函数需要const int*
而不是int*
,那么你只需要一个小的trampoline函数来将指针拉出大括号初始值生成的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()
作为第二个参数传递。
答案 2 :(得分:2)
Wikipedia似乎暗示你可以这样做,但只能通过声明函数将std::initializer_list<int>
作为参数。