2009-10-06 25 views
5

を使用して、一時的な集約オブジェクトを初期化するのは、私はクラスがあるとしましょう:中括弧に

class Aggregate { 

public: 

    int x; 
    int y; 

}; 

私は中括弧を使用してオブジェクトを初期化する方法を知っている:

Aggregate a1 = { 1500, 2900 }; 

をしかし、私は正しいを見つけることができません例えば、一時的なオブジェクトを作成し、いくつかのメソッドに引数として渡しする構文:

void frobnicate(const Aggregate& arg) { 
    // do something 
} 

//... 

frobnicate(Aggregate {1500, 2900}); // what should this line look like? 

最も簡単な方法をAggregateクラスにコンストラクタを追加することですが、Aggregateヘッダへのアクセス権がないと仮定しましょう。もう一つのアイデアは、などなど、私もオブジェクトを作成し、それを引数として渡すことができますファクトリメソッド、つまり

Aggregate makeAggregate(int x, int y). 

のいくつかの種類を書くことであろう

あり多くのソリューションがありますが、私は」中括弧の初期化を使用してこの目標を達成することが可能かどうか不思議です。

+0

Uh ...ヘッダーにアクセスできない場合は、中括弧を使ってオブジェクトを初期化することはできないと思いますか? – unwind

+3

makeXXXのアプローチはそれほど悪くはありません。最近のコンパイラは、効率的なコードにつながるNRVO(戻り値の最適化)を適用することができます。 NRVOが適用され、関数がインライン化されている場合、これは効率の面でC++ 0xの構文と同等です。 – sellibitze

答えて

8

C++ 0xイニシャライザのリストでは、どんなことが可能ですか?

GCC 4.4は既に-std=c++0xフラグでこれをサポートしています。おそらくVS2010 CTPもこれをサポートしています(私が間違っていれば私を修正してください)。

C++ 98/C++ 03では、コンストラクタを作成して呼び出す必要があります。

1

"多くの解決策がありますが、中括弧の初期化を使用してこの目標を達成することが可能かどうかは不思議です。"

できません。あなたは、ソースを変更できない場合、あなたの唯一のオプションは、インライン関数やヘルパー構造体でそれをラップするために、次のとおりです。

struct AggregateHelper 
{ 
    Aggregate a; 
    AggregateHelper(int x, int y) { a.x=x; a.y=y; } 
    operator const Aggregate&() { return a; } 
}; 

frobnicate(AggregateHelper(1500,2900)); 

編集:削除無関係なコンストラクタソリューション。

+0

これはまた、タイプのプロパティを集約(この場合はPOD)から非集約に変更します。これは予期しない可能性があり、すべての事前{}初期化のために検索と置換が必要になります。 –