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 に答える