0
C++14 LWG.2148
列挙型のハッシュサポート
高橋 晶(Akira Takahashi)
faithandbrave@longgate.co.jp
2014/06/27(金) WG21 C++14 DISレビュー会議
まえがき
• この資料は、C++14に取り入れられる予定の変更、LWG
(Library Working Group)のIssue 2148のレビューです。
• 2148. Hashing enums should be supported d...
概要
• std::unordered_mapのキーとして列挙型を指定可能にする。
• そのために、enumおよびenum classで定義されたあらゆる列
挙型(列挙型コンセプトを満たすあらゆる型)を、std::hash
クラスがサポートする。
規格の変更内容 1/2
• 20.9 [function.objects], <functional>のヘッダ概要
namespace std {
[…]
// 20.8.12, hash function baseprimary templa...
規格の変更内容 2/2
• 20.8.12 [unord.hash] のパラグラフ1
-1- The unordered associative containers defined in 23.5
[unord] use specializat...
どのように実装するか 1/2
• libc++は、以下のように実装している:
namespace std {
template <class T> // プライマリテンプレート
struct hash {
static_assert(is_en...
どのように実装するか 2/2
• std::hashのプライマリテンプレートを、enum用に使う。
• std::underlying_typeメタ関数を使用して、列挙型のベース
となる整数型を取得し、
• 整数型のstd::hash特殊化に転...
所感
• 今後、このようなコンセプトによる特殊化が標準ライブラリ
内でさらに必要になった場合、std::hashのプライマリテン
プレートが複雑になっていく。
• 具体的には、コンセプトごとにハッシュ関数を切り替えるために、実装用
の関数テンプ...
考えられる仕様
namespace std {
template <Enumerable T>
size_t hash_value(T x) noexcept;
!
template <class T> // プライマリテンプレート
struc...
Upcoming SlideShare
Loading in...5
×

C++14 enum hash

6,163

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,163
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "C++14 enum hash"

  1. 1. C++14 LWG.2148 列挙型のハッシュサポート 高橋 晶(Akira Takahashi) faithandbrave@longgate.co.jp 2014/06/27(金) WG21 C++14 DISレビュー会議
  2. 2. まえがき • この資料は、C++14に取り入れられる予定の変更、LWG (Library Working Group)のIssue 2148のレビューです。 • 2148. Hashing enums should be supported directly by std::hash • http://www.open-std.org/jtc1/sc22/wg21/docs/lwg- defects.html#2148
  3. 3. 概要 • std::unordered_mapのキーとして列挙型を指定可能にする。 • そのために、enumおよびenum classで定義されたあらゆる列 挙型(列挙型コンセプトを満たすあらゆる型)を、std::hash クラスがサポートする。
  4. 4. 規格の変更内容 1/2 • 20.9 [function.objects], <functional>のヘッダ概要 namespace std { […] // 20.8.12, hash function baseprimary template: template <class T> struct hash; […] }
  5. 5. 規格の変更内容 2/2 • 20.8.12 [unord.hash] のパラグラフ1 -1- The unordered associative containers defined in 23.5 [unord] use specializations of the class template hash as the default hash function. For all object types Key for which there exists a specialization hash<Key>, and for all enumeration types (7.2 [dcl.enum]) Key, the instantiation hash<Key> shall: […] 非順序連想コンテナは、デフォルトのハッシュ関数としてクラステンプレート hashの特殊化を使用する。hash<Key>の特殊化が存在するKey型の全てのオブジェ クト、および全ての列挙型Keyについて、hash<Key>のインスタンス化は以下を満 たさなければならない:
  6. 6. どのように実装するか 1/2 • libc++は、以下のように実装している: namespace std { template <class T> // プライマリテンプレート struct hash { static_assert(is_enum<T>::value, “…”); ! size_t operator()(T x) const noexcept { using type = typename underlying_type<T>::type; return hash<type>{}(static_cast<type>(x)); } }; }
  7. 7. どのように実装するか 2/2 • std::hashのプライマリテンプレートを、enum用に使う。 • std::underlying_typeメタ関数を使用して、列挙型のベース となる整数型を取得し、 • 整数型のstd::hash特殊化に転送する。
  8. 8. 所感 • 今後、このようなコンセプトによる特殊化が標準ライブラリ 内でさらに必要になった場合、std::hashのプライマリテン プレートが複雑になっていく。 • 具体的には、コンセプトごとにハッシュ関数を切り替えるために、実装用 の関数テンプレートを用意し、SFINAEもしくはConceptでオーバーロー ドしていくことになる。 • そのような提案が上がってきた場合には、std::hashクラス テンプレートの仕様を整理する必要がある。 • Boostのように、オーバーロード可能な関数を実装として
 許可することが考えられる。
  9. 9. 考えられる仕様 namespace std { template <Enumerable T> size_t hash_value(T x) noexcept; ! template <class T> // プライマリテンプレート struct hash { size_t operator()(T x) const noexcept { return hash_value(x); // 関数テンプレートに転送 } }; } • ADLについても考える必要がある。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×