ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 绑定到weak_ptr

2019-09-30 21:11:41  阅读:321  来源: 互联网

标签:std-function weak-ptr c callback bind


有没有办法将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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有