gpt4 book ai didi

c++ - 如何创建一个可以为 T 选择特殊容器的模板类?

转载 作者:太空狗 更新时间:2023-10-29 20:09:06 25 4
gpt4 key购买 nike

我如何创建一个模板类,它可以理解类型 T 是否可散列,如果是,则使用 std::unodered_set 收集类型的元素吨?。否则,我希望它使用 std::set

该类具有与上述sets相同的简单方法,如insert()、find()等。

template<class T>
class MySet {
public:
MySet() {}
bool find() {
//some code here

我检查类型是否有 operator() 以获取有关其“可哈希性”的信息。为此,我使用了我在这个网站上找到的以下结构:

template<typename T>
class HasHash {
typedef char one;
typedef long two;

template<typename C>
static one test(decltype(&C::operator()));

template<typename C>
static two test(...);

public:
enum {
value = sizeof(test<T>(0)) == sizeof(size_t)
};
};

并通过键入获取是否可哈希(真或假):

HasHash<HashableType>::value

我无法使用 boost 库。

最佳答案

如果你有一个 is_hashable<T>输入特征(例如你的 HasHash ),然后你可以使用 std::conditional ,像这样:

template <typename T>
std::conditional<is_hashable<T>::value, std::unordered_set<T>, std::set<T>>::type

或者如果您使用的是 C++17,它可以简化为:

template <typename T>
inline constexpr bool is_hashable_v = is_hashable<T>::value;

template <typename T>
std::conditional_t<is_hashable_v<T>, std::unordered_set<T>, std::set<T>>;

(假设您还实现了 _v 版本的特征)。

关于确定可哈希性的一些额外讨论,这也很有趣:

Check if type is hashable

在网站上。

关于c++ - 如何创建一个可以为 T 选择特殊容器的模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330986/

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