【发布时间】:2018-03-16 23:49:46
【问题描述】:
如何创建一个模板类,它可以理解T 类型是否是可散列的,如果是,则使用std::unodered_set 来收集T 类型的元素?否则,我希望它使用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)
};
};
通过键入以下内容,get 是否可散列(真或假):
HasHash<HashableType>::value
我无法使用 boost 库。
【问题讨论】:
-
this 能解决你的问题吗?
-
我看过这篇文章,我已经解决了我的那部分问题。问题是如何创建将针对不同类型使用不同
sets的类。 -
std::conditional_t<is_hashable_v<T>, std::unordered_set<T>, std::set<T>>怎么样? -
看起来不错,谢谢!我试试看。