C ++ 0x绑定和函数没有copy-construction

时间:2011-03-08 16:54:43

标签: function boost c++11 bind

我目前正在尝试一些新的C ++ 0x功能,即std :: function和std :: bind。这两个函数似乎非常适合C ++的事件委托系统,就像在C♯中一样。我之前尝试过创建像委托之类的东西,但是我需要的成员函数指针对我来说非常重要......

在我的测试中,我注意到std :: bind会复制你绑定的每个对象。虽然这确实增强了安全性 - 无法删除仍然注册的事件处理程序:) - 它也是有状态对象的问题。有没有办法停用复制 - 或者至少是从std :: function再次获取封装对象的方法?

PS:是否有对C ++ 0x中包含的功能的参考(希望是C ++ 11!)最后它是TR1的主要部分和一些加法...

我试过cppreference.org,但他们仍处于文档的早期阶段,另外cplusplus.com似乎甚至没有开始覆盖C ++ 0x。

3 个答案:

答案 0 :(得分:2)

如果您想避免复制,请使用std::ref和/或std::cref。它们将对象包装成伪参考

答案 1 :(得分:1)

这是不对的:

  

我注意到每个std :: bind都会复制   你绑定的对象。

至少那不是预期的规格。您应该能够将不可复制的对象移动到绑定中:

std::bind(f, std::unique_ptr<int>(new int(3)))

但是,现在只移动对象存储在活页夹中,它是一个左值。因此,只有f接受左值移动对象(例如左值引用)时,才能调用它。如果这是不可接受的,并且如果源对象超过了绑定器,那么使用std::ref是另一个很好的解决方案(如Armen所述)。

如果需要复制绑定对象,则其所有绑定参数都必须是可复制的。但是如果你只移动构造绑定对象,那么它只会移动构造它的绑定参数。

最佳参考是N3242。我还没有一个很好的全面的教程。我可以从the boost documentation开始,理解std :: bind已经过调整,可以尽可能地使用rvalue-ref。

答案 2 :(得分:0)

我创建了一个可移动兼容的bind版本。还有很多问题,比如粘合剂构造函数和一些buggylines在这里和那里等但它似乎工作

在这里查看 http://code-slim-jim.blogspot.jp/2012/11/perfect-forwarding-bind-compatable-with.html