C++14 enum hash
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
5,773
On Slideshare
581
From Embeds
5,192
Number of Embeds
10

Actions

Shares
Downloads
1
Comments
0
Likes
0

Embeds 5,192

http://faithandbrave.hateblo.jp 4,978
http://feedly.com 133
http://www.feedspot.com 57
http://digg.com 15
https://www.inoreader.com 3
http://www.inoreader.com 2
https://pgwork.net 1
https://www.commafeed.com 1
http://atom-server 1
http://feedreader.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. C++14 LWG.2148 列挙型のハッシュサポート 高橋 晶(Akira Takahashi) faithandbrave@longgate.co.jp 2014/06/27(金) WG21 C++14 DISレビュー会議
  • 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. 概要 • std::unordered_mapのキーとして列挙型を指定可能にする。 • そのために、enumおよびenum classで定義されたあらゆる列 挙型(列挙型コンセプトを満たすあらゆる型)を、std::hash クラスがサポートする。
  • 4. 規格の変更内容 1/2 • 20.9 [function.objects], <functional>のヘッダ概要 namespace std { […] // 20.8.12, hash function baseprimary template: template <class T> struct hash; […] }
  • 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. どのように実装するか 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. どのように実装するか 2/2 • std::hashのプライマリテンプレートを、enum用に使う。 • std::underlying_typeメタ関数を使用して、列挙型のベース となる整数型を取得し、 • 整数型のstd::hash特殊化に転送する。
  • 8. 所感 • 今後、このようなコンセプトによる特殊化が標準ライブラリ 内でさらに必要になった場合、std::hashのプライマリテン プレートが複雑になっていく。 • 具体的には、コンセプトごとにハッシュ関数を切り替えるために、実装用 の関数テンプレートを用意し、SFINAEもしくはConceptでオーバーロー ドしていくことになる。 • そのような提案が上がってきた場合には、std::hashクラス テンプレートの仕様を整理する必要がある。 • Boostのように、オーバーロード可能な関数を実装として
 許可することが考えられる。
  • 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についても考える必要がある。