Tôi có hàm băm có thể lấy bất kỳ loại đối tượng nào và băm nó, nó sử dụng std::hash
nội bộ. Bởi vì std::hash
không hỗ trợ loại enum tôi đã tạo ra quá tải của hàm, 1 cho enumerations sử dụng std::underlying_type
và 1 cho các loại:std :: có điều kiện vs std :: enable_if
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);
}
này đang làm việc tốt. sau đó tôi đã cố gắng để đưa tất cả vào một chức năng duy nhất với 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);
}
chính:
enum test
{
TEST = 2
};
int main() {
Hash<test>(TEST);
Hash<int>(5);
std::cin.get();
return 0;
}
này tuy nhiên, đã cho tôi một error:
/usr/include/c++/5/type_traits:2190:38: error: 'int' is not an enumeration type typedef __underlying_type(_Tp) type;
tôi hiểu được nhưng tôi không hiểu tại sao, tôi nghĩ rằng std::conditional
sẽ ngăn chặn các lỗi biên dịch thời gian này vì <int>
sử dụng std::hash<T>
thay vì std::hash<typename std::underlying_type<T>::type>
lúc biên dịch.
Tôi đang làm gì sai ở đây, có cách nào tôi có thể hợp nhất 2 chức năng không?
Trong ngắn hạn, 'điều kiện' yêu cầu cả hai nhánh phải được định dạng tốt. Việc sáp nhập cả hai nhánh có thể được thực hiện với cấu trúc đặc điểm. – Rostislav