2012-04-04 18 views
9

Visual Studio 2010/2011でバリデーションテンプレート(まだ!)がない場合、多くのパラメータを必要とするコンストラクタには問題があります。例えば、以下はコンパイルされません。std :: make_sharedコンストラクタのパラメータ数

MyMaterials.push_back(std::make_shared<Material>(MyFacade, 
                name, 
                ambient, 
                diffuse, 
                specular, 
                emissive, 
                opacity, 
                shininess, 
                shininessStrength, 
                reflectivity, 
                bumpScaling, 
                maps, 
                mapFlags)); 

、それは13個のパラメータを持っていると私はmake_sharedがarg0にからARG9に限定されていると思うので。明らかな回避策は2つの部分からなる構造ですが、私はこれを避けることを望んでいました。 make_sharedの代わりに新しいの使用を除いて、他の可能性はありますか?

ありがとうございました。

答えて

20

あなたは、ヒープ割り当て値に移動されるクラスを作成することができます。

​​
+0

ああ。もちろん。それは完璧な意味合いがあります。 – Robinson

+0

良いことは、make_sharedもshared_ptrを作成するときに最適化された1割り当てルーチンを使用することです。 –

+0

残念ですが、これはローカルスタック(Material()が構築されている場所)からヒープ(ここでmake_sharedは実際にそれを置く)。この場合、コピーはどのように回避できますか? – Mordachai

1

関連するすべてのメンバーで「入力構造体」を作成できます。
正しい値を入力し、それを唯一のパラメータとしてコンストラクタを呼び出します。

+0

また良いアイデアだが、私はこのようなもののための無関係な "ランダムな"構造体を避けたい。 – Robinson

関連する問題