为什么enable_shared_from_this不能直接访问内嵌的weak_ptr ?
Why does enable_shared_from_this lack direct access to the embedded weak_ptr?
我想在多线程应用程序中使用boost signals2与自动连接管理。我的类继承自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 ();
};
我知道我的设计目标可能是冲突的(自动连接管理和线程安全,以及快速代码),但无论如何:
为什么
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;
};
您不能访问weak_ptr
的原因是enable_shared_from_this
不必须使用一个。拥有weak_ptr
只是enable_shared_from_this
的一个可能的实现。它不是唯一的。
由于enable_shared_from_this
是与shared_ptr
相同的标准库的一部分,因此可以使用比直接存储weak_ptr
更有效的实现。委员会不想阻止这种优化。
//好,但是慢吗?两个临时智能指针
这只是一个临时智能指针。除了第一个对象,复制省略/移动应该照顾到其他对象。
这可能是因为没有shared_ptr
引用Cat
实例。weak_ptr
要求至少有一个活动shared_ptr
尝试将shared_ptr
作为成员变量并首先在connect
方法中分配给它:
typedef boost::signals2::signal<void ()> signal_type;
struct Cat : public enable_shared_from_this<Cat>
{
void meow ();
boost::shared_ptr<Cat> test;
void connect (signal_type& s)
{
test = shared_from_this();
s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (weak_from_this ()));
}
};
但基本上,如果没有shared_ptr
,就没有weak_ptr
。如果所有的shared_ptr
都消失了,而weak_ptr
还在使用中,那么weak_ptr
可能指向一个不存在的对象。
注意:我的测试不应该在生产代码中使用,因为它将导致对象永远不会被释放。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 如何从OpenCV Mat访问浮点值(.at和.ptr除外)
- 读取访问冲突_First为空Ptr
- 如何访问受保护的基类函数,从派生类通过基类ptr
- 从数组的共享ptr访问共享ptr
- 为什么int** ptr在访问ptr[i][j]时不指向与int arr[3][3]相同的地址?
- 当可以在类对象超出范围之前删除此数据时,类允许访问其数据(通过 ptr/it)是否设计不好