我目前正在尝试一些新的C ++ 0x功能,即std :: function和std :: bind。这两个函数似乎非常适合C ++的事件委托系统,就像在C♯中一样。我之前尝试过创建像委托之类的东西,但是我需要的成员函数指针对我来说非常重要......
在我的测试中,我注意到std :: bind会复制你绑定的每个对象。虽然这确实增强了安全性 - 无法删除仍然注册的事件处理程序:) - 它也是有状态对象的问题。有没有办法停用复制 - 或者至少是从std :: function再次获取封装对象的方法?
PS:是否有对C ++ 0x中包含的功能的参考(希望是C ++ 11!)最后它是TR1的主要部分和一些加法...
我试过cppreference.org,但他们仍处于文档的早期阶段,另外cplusplus.com似乎甚至没有开始覆盖C ++ 0x。
答案 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