2009-08-26 8 views
7

私は新しいオブジェクトを作成し、boost :: bindを使ってオブジェクトのリストに追加しようとしています。例えば。boost :: bindをコンストラクタで使用する

struct Stuff {int some_member;}; 
struct Object{ 
    Object(int n); 
}; 
.... 
list<Stuff> a; 
list<Object> objs; 
.... 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(Object, 
    boost::bind(&Stuff::some_member,_1) 
) 
); 

これは動作していません。ブースト::バインドでコンストラクタを使用する方法はありますか他の方法を試してみるべきですか?

+0

「動作している」とはどういう意味ですか?それはコンパイルされていないか、リストに値が設定されていませんか? – Dewfy

+1

実際にコンパイルされるコードが役に立ちます。 "a"とは何か - コレクションの開始と終了のメソッドを持っているようですが、some_memberも表示されますか? –

+0

jon、それは私のところでは誤りでした。今修正されました。 Dewfy、コードはコンパイルされません。 –

答えて

5

Stuff::some_memberintで、Objectintを取って非明示的なctorのを持っている場合、これは動作するはずです:

list<Stuff> a; 
list<Object> objs; 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(&Stuff::some_member,_1) 
); 

そうでない場合は、あなたが使用することができboost::lambda::constructor

+0

私は自分のコードをあまりにも単純化しました。私の実際のコードのコンストラクタは3つの引数を取ったので、暗黙的な変換ではトリックは機能しません。リンクは私の質問に完全に答えました。ありがとう。 –

0

a::some_memberが返すものによって異なります。Objectの場合は、Objectに結果をラップする必要はありません。これは既に構築されています。ルーチンがObjectを返さない場合は、boost::bindで取り出すことができる結果を少しだけマッサージする必要がありますが、ユーティリティ関数はコードを読みやすくします。

どちらの場合でも、より多くのコードが役に立ちます。具体的には、タイプインスタンスaObjectです。

+0

コードを少し変更しました。私はObject(int)コンストラクタとStuff :: some_memberがintであると言うことができます。基本的に私の質問は、boost :: bind(Object、...)という形式のものは何でもできるか、バインドする引数として許可されていないコンストラクタですか? –

3

エリックのリンクは、それがある」の部分には、言いますコンストラクタのアドレスを取ることができないため、コンストラクタをバインド式のターゲット関数として使用することはできません。だから私がやろうとしていたことは不可能でした。

私は、関数を作成することによって、その周りになった:

Object Object_factory(int n) 
{ return Object(n); } 

と私はObjectコンストラクタを使用しようとしていたところObject_factoryを使用します。

11

ブースト1.43を使用している場合は、boost :: factoryとboost :: value_factoryを使用すると、コンストラクターの呼び出しをカプセル化できます。 このように:

transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(boost::value_factory<Object>(), 
    boost::bind(&Stuff::some_member,_1) 
) 
); 
関連する問題