我正在爲我的對象寫一個散列函數。我已經可以散列容器,並結合散列,感謝Generic Hash function for all STL-containers。但我的課也有枚舉。當然,我可以爲每個枚舉創建一個哈希函數,但似乎並不是一個好主意。是否有可能爲std::hash
創建一些通用規範,以便它可以應用於每個枚舉?類似的東西,使用std::enable_if
和std::is_enum
C++ 11任何枚舉類型的散列函數
namespace std {
template <class E>
class hash<typename std::enable_if<std::is_enum<E>::value, E>::type> {
public:
size_t operator()(const E& e) const {
return std::hash<std::underlying_type<E>::type>()(e);
}
};
};
PS。此代碼不能編譯
error: template parameters not used in partial specialization:
error: ‘E’
這個'template class hash'定義了一個主模板'hash',而不是專門化。專業化看起來像:'template class hash >'。我真的不認爲你可以重新定義主要模板'std :: hash '。 –
cdyson37
2015-01-29 17:26:12
@ cdyson37此外,你所提到的似乎是_partial specialization_完整的專業化看起來像'template <>結構散列 {...}; ** **,部分專業化是違背標準,並指定爲**未定義的行爲**。看到這[SO問題/答案](http://stackoverflow.com/questions/28077592/extending-namespace-std-via-partial-template-specialization)。 –
2015-02-02 03:48:03
這確實是一個部分專業化。但我相信這是允許的 - 看看[這裏](http://stackoverflow.com/questions/23339298/stdhash-template-partial-specialization) – cdyson37 2015-02-11 15:03:01