2

我有以下课程:

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

现在,我已经vector<A*> availableObjs人满为患了。我想调用clone其中的每一个,因此将克隆的对象插入到clonedObjs类型的新容器中vector<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)期望 anA*作为它的第一个参数。这是调用方法的通常隐式指定的实例。的第一个“真实”参数A::clone是的第二个参数,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 回答