C++ 斯威夫特';s[弱自我]C+的替代方案+;

C++ 斯威夫特';s[弱自我]C+的替代方案+;,c++,lambda,lifetime,C++,Lambda,Lifetime,在Swift编程语言中,通常通过弱引用将self传递到闭包中,例如: self.someAsyncFunction(param1, param2, { [weak self] in self?.doSomething() }) 对我来说这是一件非常方便的事情 C++中是否有相似之处?例如: this->someAsyncFunction(param1, param2, [this](){ this->doSomething(); }); 调用方的实例(或此)可能

在Swift编程语言中,通常通过弱引用将
self
传递到闭包中,例如:

self.someAsyncFunction(param1, param2, { [weak self] in
    self?.doSomething()
})
对我来说这是一件非常方便的事情

C++中是否有相似之处?例如:

this->someAsyncFunction(param1, param2, [this](){
    this->doSomething();
});
调用方的实例(或
)可能在执行lambda时已被删除。结果,它在
this->doSomething()
上崩溃。 换句话说,我想要这样的东西:

this->someAsyncFunction(param1, param2, [weak this](){
    if (this)
        this->doSomething();
});

当然不是C++代码,

处理此类问题是否有良好的做法

理想情况下,解决方案必须处理所有可能的问题,例如

  • 新建
    创建,并通过
    删除
    删除
  • 的生存期由
    std::shared\u ptr
    控制
  • 的生存期由
    boost::intrusive_ptr
    控制

但它需要一个<代码> SyddYpPTR>代码>。C++不是托管语言,所以<代码>这个< /C>永远是<代码>这个< /C>,它将不会突然改变,意外地变成任何东西,但是<代码>这个< /C>代码>这是永远的。如果其他内容删除了
,则您的
仍将是相同的
,但使用
将成为未定义的行为<代码>此不公平,但<代码> < <代码>是C++。因此,这里唯一需要探索的选项将涉及到智能指针。C++倾向于“除非你选择了设备(和开销),否则你不会为此付出代价。
std::shared_ptr
std::enable_shared_from_this
(由Sombrero Chicken链接)是您正在寻找的设施(和开销)。从架构的角度来看,我不喜欢我的对象自我意识到它们属于
共享的\u ptr
。但是如果我真的需要它们,我会使用它。你能改变类(但是它的实例被管理)来支持这个用法吗?但是它需要一个<代码> SyddypTr>代码>。C++不是一个管理语言,所以<代码>这个< /C>永远是<代码>这个< /C>,而且它不会突然改变,意外地,而不是变成这个<代码>这是永远的。如果其他内容删除了
,则您的
仍将是相同的
,但使用
将成为未定义的行为<代码>此不公平,但<代码> < <代码>是C++。因此,这里唯一需要探索的选项将涉及到智能指针。C++倾向于“除非你选择了设备(和开销),否则你不会为此付出代价。
std::shared_ptr
std::enable_shared_from_this
(由Sombrero Chicken链接)是您正在寻找的设施(和开销)。从架构的角度来看,我不喜欢我的对象自我意识到它们属于
共享的\u ptr
。但是如果我真的需要它们,我会使用它。你能改变类(不管它的实例是如何管理的)来支持这种用法吗?