我有一个unordered_set,其中shared_ptrs作为键。这在99%的情况下运行良好,但在同样的情况下,我需要从类内部搜索集合,我想避免继承enable_shared_from_this,因为这样。
可以/如何通过原始指针搜索shared_ptr的unordered_set。
答案 0 :(得分:6)
哈希shared_ptr
哈希get()
并比较shared_ptr
比较get()
,所以让我们与shared_ptr
进行非拥有std::shared_ptr<T> key(std::shared_ptr<T>(),
this /* or whatever pointer you want to search for */);
别名构造函数:
unordered_set
然后搜索container-2
。
与使用空删除器相比,它更便宜,因为它没有分配控制块。
答案 1 :(得分:3)
不,unordered_set
没有允许您根据Key
类型的实际实例以外的任何内容进行搜索的功能。
但是,shared_ptr<T>
有3个重要功能可以让您获得所需的效果:
std::hash<shared_ptr<T>>
定义为等同于散列T*
。
std::shared_ptr
的{{1}}根据operator==
比较指针。
您可以创建一个shared_ptr::get
,其中包含一个实际上不会删除该对象的删除工具。
因此,您可以创建一个虚假的shared_ptr
:
shared_ptr
只要T *ptr = this;
auto sp = shared_ptr<T>(ptr, [](T*) {} );
auto it = the_set.find(sp);
没有逃避你的范围(你真的不想保留它),你就没事了。