gpt4 book ai didi

c++ - 在 std::unordered_set (C++20) 中找到一个指针 T*

转载 作者:行者123 更新时间:2023-12-03 06:50:13 24 4
gpt4 key购买 nike

正如 Using a std::unordered_set of std::unique_ptr 中所指出的,不容易找到指针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>{}();
}
}

关于c++ - 在 std::unordered_set<std::unique_ptr> (C++20) 中找到一个指针 T*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64243246/

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