其他分享
首页 > 其他分享> > c – 绑定到weak_ptr

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