0

我正在尝试将一组Data*指针传递给函数。

void f(int argc, Data** argv) {
    ...
}
// at this point, I have Data* x, Data* y initialized
f(2, {x, y});

有没有办法让这样的代码运行,其中数组定义内联在函数调用中?现在,返回的错误是

closure3.cc:15:8: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
closure3.cc:15:16: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘Data**’ for argument ‘2’ to ‘void f(int, Data**)’

有没有办法让数组内联实例化,是否可以在没有 C++0x 的情况下做到这一点?提前致谢。

4

3 回答 3

4

您可能需要考虑使用可变长度参数,这样您就不必内联实例化列表。

http://www.cprogramming.com/tutorial/lesson17.html

于 2012-12-04T05:28:58.717 回答
0

大括号初始值设定项仅在声明数组变量时可用。所以你不能这样做。

从技术上讲,您可以使用函数来完成(注意:这是未经测试的)

Data ** pair_of_data(Data * x, Data * y)
{
  Data ** result = new Data*[2];
  result[0] = x;
  result[1] = y;
  return result;
}

但这很丑,有几个原因:

  1. 数组最终在堆上,这真的是不必要的
  2. 每次使用该功能时,您都要求(轻微)内存泄漏。
  3. 它需要重载以模拟可变参数,或者更改为使用可变参数,从而失去类型安全性。

如果您特别需要传递对,请考虑std::pair改用。这些可以使用std::make_pair.

不过,最后,使用 STL 容器可能更容易,或者在调用函数之前声明一个数组变量,以便使用聚合初始化。或添加-std=c++0x标志。

于 2012-12-04T05:44:37.410 回答
-2

如果你真的想要它没有 C++11 特性,你可以尝试这样做(不是好的代码,只是为了展示这个想法):

vector<int> InitList(int first, ...)
{
    vector<int> arr;
    int *p = &first;

    while(*(p + 1))
    {
        arr.push_back(*p);
        p++;
    }

    return arr;
}

int main()
{
    F(2, InitList(1, 2, 3));
}
于 2012-12-04T05:32:28.713 回答