7

新しいオブジェクトを作成し、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)
  )
);

これは機能していないようです。boost :: bindでコンストラクターを使用する方法はありますか、それとも他の方法を試す必要がありますか?

4

4 に答える 4

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)
  )
);
于 2010-11-05T02:29:05.937 に答える
5

Stuff::some_memberintあり、Objectを受け取る非明示的な ctor がある場合int、これは機能するはずです。

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

それ以外の場合は、boost::lambda::constructorを使用できます

于 2009-08-26T18:10:04.880 に答える
3

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

関数を作成することでそれを回避しました:

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

そして、Object コンストラクターを使用しようとしていた場所で Object_factory を使用しました。

于 2009-08-26T19:13:15.563 に答える
0

a::some_memberが返されるかによって異なります。もしそれが の場合Object、結果を ctor でラップする必要はありませんObject。すでに構築されています。ルーチンが を返さない場合はObject、結果を少し処理する必要がある可能性があります。これは、プルすることもできますboost::bindが、ユーティリティ関数を使用すると、コードが読みやすくなる場合があります。

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

于 2009-08-26T16:27:53.370 に答える