【发布时间】:2013-04-10 14:38:47
【问题描述】:
我想在多线程应用程序中使用带有自动连接管理的升压信号2。我的类继承自enable_shared_from_this<>,我想从另一个成员方法中连接一个成员方法。连接可能会经常重建,因此我的代码应该尽可能快(尽管提升了信号 2 性能本身):
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 ();
};
我知道我的设计目标可能会相互冲突(自动连接管理和线程安全以及快速代码),但无论如何:
为什么
enable_shared_from_this<>无法直接访问嵌入式weak_ptr<>?我看不到相反的理由。有没有和我类似的用例?有比上述更快的解决方法吗?
编辑:
我知道我可以这样做,但我想避免额外的存储/初始化检查惩罚:
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;
};
【问题讨论】:
-
谁说那是“慢”?什么是“慢”?
-
我需要两个临时智能指针实例,这将导致至少 4 次多余的互锁操作,只是为了构造一个已经存在的 weak_ptr。
-
首先,它不“已经存在”;看我的回答。其次,这不会使它慢。您是否有一些分析数据表明这是一个问题?
-
因为
enable_shared_from_this接口不是必需 来使用weak_ptr,但实际上可以 - 为什么不直接创建自己的enable_weak_from_this?原件小于 80 行,包括版权信息和空格。你想做一些不同于图书馆提供的常见情况的事情,所以你可以自己做。 -
这将是 C++17 的一部分,请参阅:en.cppreference.com/w/cpp/memory/enable_shared_from_this/…
标签: c++ shared-ptr boost-signals2