gpt4 book ai didi

c++ - std::conditional vs std::enable_if

转载 作者:IT老高 更新时间:2023-10-28 22:35:15 25 4
gpt4 key购买 nike

我有一个散列函数,它可以接受任何对象类型并对其进行散列,它使用 std::hash内部。因为std::hash不支持枚举类型我创建了函数的重载,1 用于枚举使用 std::underlying_type其他类型为 1:

template <typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
static std::size_t Hash(T const & t)
{
return std::hash<typename std::underlying_type<T>::type>()(t);
}

template <typename T, typename std::enable_if<!std::is_enum<T>::value>::type* = nullptr>
static std::size_t Hash(T const & t)
{
return std::hash<T>()(t);
}

这工作正常。然后我尝试使用 std::conditional 将它们全部放入一个函数中:

template <typename T>
static std::size_t Hash(T const & t)
{
typedef typename std::conditional<std::is_enum<T>::value, std::hash<typename std::underlying_type<T>::type>, std::hash<T>>::type Hasher;
return Hasher()(t);
}

主要:

enum test
{
TEST = 2
};

int main() {
Hash<test>(TEST);
Hash<int>(5);
std::cin.get();
return 0;
}

然而,这给了我一个 error :

/usr/include/c++/5/type_traits:2190:38: error: 'int' is not an enumeration type typedef __underlying_type(_Tp) type;

我确实理解错误,但我不明白为什么,我想 std::conditional将防止这些编译时错误,因为 <int>使用 std::hash<T>而不是 std::hash<typename std::underlying_type<T>::type>在编译时。

我在这里做错了什么,有没有办法可以合并这两个函数?

最佳答案

问题是,如果模板参数不是枚举,std::underlying_type 格式不正确,std::conditional 的两个分支都需要有效。

一种可能性是制作一个 safe_underlying_type 特征,如果 T 不是枚举,则它只返回 void:

template <typename T, typename = typename std::is_enum<T>::type>
struct safe_underlying_type {
using type = void;
};

template <typename T>
struct safe_underlying_type<T, std::true_type> {
using type = std::underlying_type_t<T>;
};

或者你可以写一个特征来获得你想要的哈希类型:

template <typename T, typename = typename std::is_enum<T>::type>
struct hash_type {
using type = std::hash<T>;
};

template <typename T>
struct hash_type<T, std::true_type> {
using type = std::hash<std::underlying_type_t<T>>;
};

关于c++ - std::conditional vs std::enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35152818/

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