gpt4 book ai didi

c++ - 为什么 enable_shared_from_this 无法直接访问嵌入式 weak_ptr?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:10 25 4
gpt4 key购买 nike

我想在多线程应用程序中使用具有自动连接管理功能的 boost signals2。我的类(class)继承自 enable_shared_from_this<>我想从另一个成员方法中连接一个成员方法。连接可能会经常重建,所以我的代码应该尽可能快(尽管 boost signals2 性能本身):

typedef boost::signals2::signal<void ()> signal_type;

struct Cat : public enable_shared_from_this<Cat>
{
void meow ();

void connect (signal_type& s)
{
// can't write this
s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (weak_from_this ()));

// ok, but slow?! two temporary smart pointers
weak_ptr<Cat> const myself (shared_from_this ());
s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (myself));
}

// i am missing something like this in the base class
// protected:
// weak_ptr<Cat> const& weak_from_this ();
};

我知道我的设计目标可能会相互冲突(自动连接管理和线程安全以及快速代码)但无论如何:

  1. 为什么 enable_shared_from_this<>无法直接访问嵌入式 weak_ptr<> ?我看不出相反的理由。有没有和我类似的用例?

  2. 是否有比上述方法更快的解决方法?

编辑:

我知道我可以这样做,但我想避免额外的存储/初始化检查惩罚:

template <typename T>
struct enable_weak_from_this : public enable_shared_from_this<T>
{
protected:
weak_ptr<T> /* const& */ weak_from_this ()
{
if (mWeakFromThis.expired ())
{
mWeakFromThis = this->shared_from_this ();
}

return mWeakFromThis;
}

private:
weak_ptr<T> mWeakFromThis;
};

最佳答案

您无法访问 weak_ptr 的原因是 enable_shared_from_this 不必使用一个weak_ptr 只是 enable_shared_from_this 的一个可能实现。它不是唯一的。

由于 enable_shared_from_this 是与 shared_ptr 相同的标准库的一部分,因此可以使用比直接存储 weak_ptr 更有效的实现。而且委员会不想阻止这种优化。

// ok, but slow?! two temporary smart pointers

那只是一个临时的智能指针。复制省略/移动应该处理除第一个对象之外的任何内容。

关于c++ - 为什么 enable_shared_from_this 无法直接访问嵌入式 weak_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com