c – 绑定到weak_ptr
作者:互联网
有没有办法将std :: bind绑定到std :: weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时,它会自动“断开连接”.
我知道如何使用shared_ptr创建一个std :: function:
std::function<void()> MyClass::GetCallback()
{
return std::function<void()>(std::bind(&MyClass::CallbackFunc, shared_from_this()));
}
但是返回的std :: function使我的对象永远保持活着.所以我想将它绑定到weak_ptr:
std::function<void()> MyClass::GetCallback()
{
std::weak_ptr<MyClass> thisWeakPtr(shared_from_this());
return std::function<void()>(std::bind(&MyClass::CallbackFunc, thisWeakPtr));
}
但那不编译. (std :: bind将不接受weak_ptr!)有没有办法绑定到weak_ptr?
我已经找到了关于这个的讨论(见下文),但似乎没有标准的实现.存储“弱功能”的最佳解决方案是什么,特别是如果Boost不可用?
讨论/研究(所有这些都使用Boost并且没有标准化):
> weak_function
> weak_ptr binding
> “weak” binding(以及fix)
> weak_fn
>另一个weak_fn
解决方法:
std::weak_ptr<MyClass> thisWeakPtr(shared_from_this());
return std::function<void()>(std::bind(&MyClass::CallbackFunc, thisWeakPtr));
你永远不应该这样做.永远.
MyClass :: CallbackFunc是MyClass类的非静态成员函数.作为非静态成员函数,必须使用MyClass的有效实例调用它.
weak_ptr的全部意义在于它不一定有效.您可以通过将其转换为shared_ptr来检测其有效性,然后测试指针是否为NULL.由于不能保证weak_ptr始终有效,因此无法使用一个非静态成员函数调用.
你所做的不再有效:
std::bind(&MyClass::CallbackFunc, nullptr)
它可以编译,但当你试图调用它时它最终会崩溃.
最好的办法是使用实际逻辑,如果weak_ptr无效,则不调用回调函数. bind不是为了做逻辑而设计的;它只是完全按照你的说法去做:调用函数.所以你需要使用一个合适的lambda:
std::weak_ptr<MyClass> thisWeakPtr(shared_from_this());
return std::function<void()>([thisWeakPtr]()
{
auto myPtr = thisWeakPtr.lock();
if(myPtr)
myPtr->CallbackFunc()
});
标签:std-function,weak-ptr,c,callback,bind 来源: https://codeday.me/bug/20190930/1836913.html