在std :: unordered_set <std :: unique_ptr>(C ++ 20)中找到指针T *

米哈伊尔

正如指出的使用的std ::的unique_ptr的一个std :: unordered_set,这是不容易找到一个指针T*std::unordered_set<std::unique_ptr<T>>在C ++ 20之前,我们被迫构造的实例std::unique_ptr<T>

由于对无序容器建议(http://wg21.link/P0919r3http://wg21.link/p1690r1进行了异构查找,因此在C ++ 20中可以解决此问题。但是可用的解决方案对我来说显得很笨拙(即使按照C ++标准)。似乎我需要从头实现而不是一个,而是两个函子(用于透明哈希和透明比较):

template<class T>
struct Equal {
    using is_transparent = void;
    bool operator()(const std::unique_ptr<T>& lhs, const std::unique_ptr<T>& rhs) const {
        return lhs == rhs;
    }
    bool operator()(const std::unique_ptr<T>& lhs, const T* rhs) const {
        return lhs.get() == rhs;
    }
    bool operator()(const T* lhs, const std::unique_ptr<T>& rhs) const {
        return lhs == rhs.get();
    }
};

template<class T>
struct Hash {
    using is_transparent = void;
    size_t operator()(const std::unique_ptr<T>& ptr) const {
        return std::hash<const T*>()(ptr.get());
    }
    size_t operator()(const T* ptr) const {
        return std::hash<const T*>()(ptr);
    }
};

template<class T>
using UnorderedSetOfUniquePtrs = std::unordered_set<std::unique_ptr<T>, Hash<T>, Equal<T>>;

演示:https : //gcc.godbolt.org/z/bqx714(该建议目前仅在MSVC中实现)。

这可以工作,但看起来像很多样板。我想念什么吗?有没有办法使用IDK,也许是一些标准的透明哈希器或相等比较器?我看到它std::equal_to<void>是透明的,但是我不能直接使用它。也许有一个偷偷摸摸的方式来定义unique_ptr<T> -> T*隐式转换“仅适用于此类UnorderedSetOfUniquePtrs”?欢迎您提出您的想法。

润滑脂

您可以将详细程度转换为std :: to_address(感谢@Caleth指出)和现存的std::hash,后者专门用于std::unique_ptr基于原始地址返回哈希(感谢@Mikhail的提示)。然后,使用成员函数模板实现哈希和相等类型(请注意,您不再需要将类型本身作为模板):

struct Equal {
    using is_transparent = void;
    template<class U, class S>
    bool operator()(const U& lhs, const S& rhs) const { 
        return std::to_address(lhs) == std::to_address(rhs); 
    }
};

struct Hash {
    using is_transparent = void;
    template<class U>
    size_t operator()(const U& ptr) const {
        return std::hash<U>{}();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用std :: unique_ptr的std :: unordered_set

来自分类Dev

参数std :: unique_ptr <T> &&的std :: move或std :: forward

来自分类Dev

std :: unordered_map <T,std :: unique_ptr <U >>是否可复制?GCC错误?

来自分类Dev

C ++ std :: unique_ptr在std :: map中

来自分类Dev

使用基于范围的for std :: set <std :: unique_ptr <T >>删除函数

来自分类Dev

如何在C ++中使用std :: unordered_set?

来自分类Dev

将std :: unique_ptr插入std :: set

来自分类Dev

指向std :: unordered_set中元素的指针/引用

来自分类Dev

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

来自分类Dev

我应该对一组指针使用std :: set还是std :: unordered_set吗?

来自分类Dev

std :: unique_ptr和指向指针的指针

来自分类Dev

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不编译?

来自分类Dev

C ++ std :: unique_ptr从函数返回并测试null

来自分类Dev

std :: unique_ptr用于需要自由的C函数

来自分类Dev

C ++ Qt std :: unique_ptr Qt版本在哪里?

来自分类Dev

C ++ std :: unique_ptr但不可移动吗?

来自分类Dev

C ++将std :: unique_ptr作为参数传递

来自分类Dev

使用std :: move(nullptr)的unique_ptr的operator =的C ++错误

来自分类Dev

C ++ 03中std :: unique_ptr的仿真

来自分类Dev

带有 STL 容器的 C++ std::unique_ptr

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

std :: unique_ptr <T>而不在堆上分配内存

来自分类Dev

std :: unique_ptr <T>而不在堆上分配内存

来自分类Dev

错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

来自分类Dev

错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

来自分类Dev

std :: unique_ptr :: release()与std :: move()

来自分类Dev

了解`std :: unordered_set`的用法

来自分类Dev

std :: unordered_set插入获取对象

Related 相关文章

  1. 1

    使用std :: unique_ptr的std :: unordered_set

  2. 2

    参数std :: unique_ptr <T> &&的std :: move或std :: forward

  3. 3

    std :: unordered_map <T,std :: unique_ptr <U >>是否可复制?GCC错误?

  4. 4

    C ++ std :: unique_ptr在std :: map中

  5. 5

    使用基于范围的for std :: set <std :: unique_ptr <T >>删除函数

  6. 6

    如何在C ++中使用std :: unordered_set?

  7. 7

    将std :: unique_ptr插入std :: set

  8. 8

    指向std :: unordered_set中元素的指针/引用

  9. 9

    如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

  10. 10

    我应该对一组指针使用std :: set还是std :: unordered_set吗?

  11. 11

    std :: unique_ptr和指向指针的指针

  12. 12

    为什么std :: shared_ptr <T> = std :: unique_ptr <T []>编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不编译?

  13. 13

    C ++ std :: unique_ptr从函数返回并测试null

  14. 14

    std :: unique_ptr用于需要自由的C函数

  15. 15

    C ++ Qt std :: unique_ptr Qt版本在哪里?

  16. 16

    C ++ std :: unique_ptr但不可移动吗?

  17. 17

    C ++将std :: unique_ptr作为参数传递

  18. 18

    使用std :: move(nullptr)的unique_ptr的operator =的C ++错误

  19. 19

    C ++ 03中std :: unique_ptr的仿真

  20. 20

    带有 STL 容器的 C++ std::unique_ptr

  21. 21

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  22. 22

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  23. 23

    std :: unique_ptr <T>而不在堆上分配内存

  24. 24

    std :: unique_ptr <T>而不在堆上分配内存

  25. 25

    错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

  26. 26

    错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

  27. 27

    std :: unique_ptr :: release()与std :: move()

  28. 28

    了解`std :: unordered_set`的用法

  29. 29

    std :: unordered_set插入获取对象

热门标签

归档