Function C++;没有复制构造的0x绑定和函数

Function C++;没有复制构造的0x绑定和函数,function,boost,c++11,bind,Function,Boost,C++11,Bind,我目前正在尝试一些新的C++0x特性,即std::function和std::bind。这两个函数似乎相当适合C++中的事件委托系统,它类似于C语言。♯. 我以前也尝试过创建类似委托的东西,但成员函数指针需要的技巧对我来说太多了 在测试期间,我注意到std::bind复制了绑定的每个对象。虽然这确实提高了安全性(不能删除仍然注册的eventhandler:)-但有状态对象也有问题。有没有一种方法可以停用复制,或者至少有一种方法可以再次从std::函数获取封装的对象 PS:对于C++0x(希望是C

我目前正在尝试一些新的C++0x特性,即std::function和std::bind。这两个函数似乎相当适合C++中的事件委托系统,它类似于C语言。♯. 我以前也尝试过创建类似委托的东西,但成员函数指针需要的技巧对我来说太多了

在测试期间,我注意到std::bind复制了绑定的每个对象。虽然这确实提高了安全性(不能删除仍然注册的eventhandler:)-但有状态对象也有问题。有没有一种方法可以停用复制,或者至少有一种方法可以再次从std::函数获取封装的对象

PS:对于C++0x(希望是C++11!)中包含的功能,是否有参考资料?最后是TR1的主要部分和一些附加内容


我尝试了cppreference.org,但它们在文档方面仍处于早期阶段,另一方面cplusplus.com似乎还没有开始讨论C++0x。

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

以下情况不太正确:

我注意到std::bind拷贝每 绑定的对象

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

std::bind(f, std::unique_ptr<int>(new int(3)))
std::bind(f,std::unique_ptr(新int(3)))
但是,现在只移动对象存储在绑定器中,它是一个左值。因此,您只能在
f
接受左值仅移动对象(比如通过左值引用)时调用它。如果这是不可接受的,并且如果源对象比绑定器寿命长,那么使用
std::ref
是另一个好的解决方案(如Armen所述)

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


最好的参考是。我还不知道有一个好的全面的教程。首先,我可能会理解std::bind已被调整为尽可能多地使用右值引用。

我已经创建了一个可移动兼容的bind版本。它仍然有很多问题,比如binders构造器和一些地方的错误等等,但它似乎可以工作

看看这里

现在,您可以随时参考boost.bind和boost.function文档。我也发现它很有用。谢谢,我认为“新”的实现是从boost派生出来的,但经过了修改……我将重新表述:绑定一个对象后,我可以删除它,以后调用函数时仍会调用它->必须有一个副本,因为原始对象已被删除!我最近有一个关于这方面的问题:(即使用
std::bind
进行右值ref转发)。