不能使用列舉類作為unordered_map鍵
I use a functor object to calculate hash of enum class:
struct EnumClassHash { template <typename T> std::size_t operator()(T t) const { return static_cast<std::size_t>(t); } };
Now you can use it as 3rd template-parameter of std::unordered_map:
enum class MyEnum {}; std::unordered_map<MyEnum, int, EnumClassHash> myMap;
So you don't need to provide a specialization of std::hash, the template argument deduction do the job. Furthermore, you can use the word using and make your own unordered_map that use std::hash or EnumClassHash depending on the Key type:
template <typename Key> using HashType = typename std::conditional<std::is_enum<Key>::value, EnumClassHash, std::hash<Key>>::type; template <typename Key, typename T> using MyUnorderedMap = std::unordered_map<Key, T, HashType<Key>>;
Now you can use MyUnorderedMap with enum class or another type:
MyUnorderedMap<int, int> myMap2; MyUnorderedMap<MyEnum, int> myMap3;
Theoretically, HashType could use std::underlying_type and then the EnumClassHash will not be necessary. That could be something like this, but I haven't tried yet:
template <typename Key> using HashType = typename std::conditional<std::is_enum<Key>::value, std::hash<std::underlying_type<Key>::type>, std::hash<Key>>::type;
If using std::underlying_type works, could be a very good proposal for the standard.
相關文章
- 列舉類
- java列舉類Java
- 列舉工具類
- Java —— 列舉類(enum 類)Java
- 【python】Enum 列舉類Python
- Java(4)列舉類Java
- Python元類與列舉類Python
- 為什麼使用列舉作為配置項(enum as configuration)是反開發模式的模式
- Java列舉類,這樣使用優雅、易懂Java
- 為什麼建議你使用列舉?
- java_06列舉類Java
- Day69.註解&列舉類的複習 -Java註解&列舉類Java
- Java enum列舉類詳解 列舉的常見用法Java
- Flutter Dart語言中列舉型別不支援以中文作為鍵名與不能自定義index不從0開始的解決辦法FlutterDart型別Index
- springboot mybatis列舉配置(每次只需新增一個列舉類即可)Spring BootMyBatis
- Java列舉類在生產環境中的使用方式Java
- Partial類、列舉、結構體結構體
- Rust 列舉類是什麼Rust
- Python 列舉類原始碼解析Python原始碼
- 【java】【列舉使用技巧】Java
- Java列舉類、註解和反射Java反射
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- 使用 MapStruct 對映列舉Struct
- 不要使用業務鍵作為資料庫主鍵資料庫
- C# 中的“智慧列舉”:如何在列舉中增加行為C#
- Java列舉類學習到進階Java
- Java列舉類與註解詳解——一篇文章讀懂列舉類與註解詳Java
- Java雙屬性列舉使用Java
- Java列舉類,你們用對了嗎?Java
- 列舉一下常見的final類?
- 轉向Kotlin——列舉類和擴充套件Kotlin套件
- 為什麼說列舉更佔記憶體,列舉原理是什麼?記憶體
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- PhpStorm 中使用 gitbash 作為 terminal 終端命令列PHPORMGit命令列
- 列舉下哪些塊元素裡面不能放哪些塊元素呢?
- 列舉
- 使用列舉的正確姿勢
- Java第七天-常用類及列舉Java