假设我们有以下功能:
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中拉出并将其传递给预期的函数,但是这种方法对我来说似乎是一个黑客能够使用我的预期功能与该表达式作为参数,这表示我认为我不应该使用该表达式作为参数,当我的预期的功能参数是单个指针,或者可能有另一种方法使用那个表达? .
解决方法
如果你的函数使用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,5});
如果您的函数需要知道数组的结尾或大小(通常是这种情况),则将init.end()或init.size()作为第二个参数传递.