mem_fun和bind1st问题

发布于 2024-08-12 00:00:05 字数 511 浏览 8 评论 0原文

我有以下课程:

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

现在,我有一个向量 availableObjs 已填充。我想对每个对象调用 clone,因此将克隆的对象插入到 vector 类型的新容器 clonedObjs 中。我正在尝试以下操作 - 但它无法编译:

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

有一个简单的方法吗?我有很多像 A 类的东西 - 所以让每一个都成为函子是一项艰巨的任务。

I've following class:

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

Now, I've a vector<A*> availableObjs populated already. I want to call clone on each of those, so and insert cloned objects into a new container clonedObjs of type vector<A*>. I'm trying following - but it doesn't compile:

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

Is there a easy way out? I've a lot classed like A - so making each of those a functor is too much task.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷路的信 2024-08-19 00:00:05

您需要使用 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) 创建的函子需要一个 A* 作为其第一个参数。这是通常隐式指定的实例,在该实例上调用该方法。 A::clone 的第一个“真实”参数是 mem_fun(&A::clone) 的第二个参数,因此需要与 bind2nd 绑定

You need to use bind2nd instead of bind1st:

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

The functor created by mem_fun(&A::clone) expects an A* as its first parameter. This is the normally implicitly specified instance on which the method is called. The first "real" parameter of A::clone is the second parameter of mem_fun(&A::clone) and therefore needs to be bound with bind2nd.

ま昔日黯然 2024-08-19 00:00:05

如果您使用 Boost.Bind 它可能看起来像这样:

std::transform(
               availableObjs.begin(), availableObjs.end(), 
               back_inserter(clonedObjs),
               boost::bind<A*>(boost::mem_fn(&A::clone), _1, container) ); 

If you use Boost.Bind it might look like this:

std::transform(
               availableObjs.begin(), availableObjs.end(), 
               back_inserter(clonedObjs),
               boost::bind<A*>(boost::mem_fn(&A::clone), _1, container) ); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文