2

私は次のクラスを持っています:

class A {
public:
// ctr and etc ...
A*   clone(B* container);
};

さて、私はvector<A*> availableObjsすでに移入しています。私はそれらのそれぞれを呼び出したいので、クローンされたオブジェクトを typecloneの新しいコンテナに挿入します。私は次のことを試みていますが、コンパイルされません:clonedObjsvector<A*>

transform(availableObjs.begin(), availableObjs.end(), back_inserter(clonedObjs),
    bind1st(mem_fun(&A::clone), container)); // container is of type B*

簡単な方法はありますか?私は多くのことを A のように分類してきました。そのため、これらのそれぞれをファンクタにするのは大変な作業です。

4

2 に答える 2

12

bind2nd代わりに使用する必要がありますbind1st

transform(availableObjs.begin(), availableObjs.end(), back_inserter(clonedObjs),
    bind2nd(mem_fun(&A::clone), container)); // container is of type B*

によって作成されたファンクターは、最初のパラメーターとしてmem_fun(&A::clone)an を期待します。A*これは、通常、メソッドが呼び出される暗黙的に指定されたインスタンスです。の最初の「実際の」パラメータA::cloneは の 2 番目のパラメータであるmem_fun(&A::clone)ため、 にバインドする必要がありますbind2nd

于 2009-11-19T12:13:51.790 に答える
2

Boost.Bindを使用すると、次のようになります。

std::transform(
               availableObjs.begin(), availableObjs.end(), 
               back_inserter(clonedObjs),
               boost::bind<A*>(boost::mem_fn(&A::clone), _1, container) ); 
于 2009-11-19T13:10:01.207 に答える