2011-02-15 104 views
5

创建我如何能实现结果就像有人会根据下面的代码示例指望它数组:C++:通过函数调用线

// assuming: void myFunction(int* arr); 

myFunction([ 123, 456, 789 ]); 

// as syntactical sugar for... 

int values[] = { 123, 456, 789 }; 
myFunction(values); 

我以为语法将工作吐出编译错误。

  • 如何在调用该函数的行中直接定义参数数组?
+0

什么是编译错误? – Maxpm 2011-02-15 23:00:32

+0

错误C2143:语法错误:在'常量'之前缺少']' – Jarx 2011-02-15 23:02:49

回答

3

你不能做到这一点语法糖与C++代码,而不是在C++ 03。其中括号是允许的,指的是一个阵列的元件的唯一场所,是在初始化命名阵列:

int arr[] = { 0, 1, 2 }; 

无处。但是,您可以实现与Boost.Assign类似的效果:

void f(const std::vector<int>& v) 
{ 
} 

// ... 
f(boost::assign::list_of(123)(456)(789)); 
3

作为C++0x标准的一部分,提出了类似于您正在寻找的内容。 我不相信有其他方法可以做到(当前)。

void function_name(std::initializer_list<float> list); 

function_name({1.0f, -3.45f, -0.4f}); 
3

如果您正在使用C(C99,特别是),你也可以使用文字这里的化合物:

myFunction((int []) {123, 456, 789}); 

但是是不是C++的一部分(你的编译器可能仍然支持他们,虽然)。在C++ 0x中,你可以使用初始化列表,但它们不会衰减到指针(不是使用原始指针是一个好主意)。

但如果你改变myFunction的的签名void myFunction(const int* arr),你就可以做做作呼叫

myFunction(std::initializer_list<int>({123, 456, 789}).begin()); 
1

你可以这样做,但你必须使用两件事情:

  1. 使用std::vector(或任何其他C++ STL类)

  2. 使用-std = C++ 0x编译开关(或其他任何你编译器使用C++ 0x标准)。