C ++ 11は、std :: type_infoのハッシュ機能を提供しますか?
-
30-09-2019 - |
質問
私はまだ自分の良い解決策に取り組んでいます ユニークなタイプのコンテナの問題 - そして、反省すると、 std::map<std::type_info, boost::any>
. 。不運にも、 std::type_info
定義しません operator<
, 、そして、私はそれがそれを定義するのは不合理だと思います。
ただし、ハッシュ関数を定義することは合理的に思えます。 std::type_info
合理的な「ハッシュ」としてのオブジェクト。したがって、あなたはaを置くことができるでしょう std::type_info
に std::unordered_map
鍵として。
C ++ 11はそのようなハッシュ関数を提供しますか?のメモリアドレスを使用します std::type_info
シングルトンは悪いハッシュ戦略ですか?
解決
事実 type_info
それほどではないのは、それをマップキーとして使用するための問題ではありません。 type_info
コピーできません。 :-)
C ++ 03で、 type_info
があります before()
の順序付けを提供するメンバー関数 type_info
オブジェクト。
C ++ 11で、 type_info
があります hash_code()
メンバー関数(C ++11§18.7.1/7):
size_t hash_code() const throw();
戻り値: 未選択の値は、プログラムの単一の実行内で、任意の2つに対して同じ値を返すものとすることを除いて、
type_info
等しいと比較されるオブジェクト。述べる: 実装では、2つの異なる値を返す必要があります
type_info
等しく比較されないオブジェクト。
type_info
から生じるオブジェクト typeid
オペレーターはプログラムの終了まで存在するため、 type_info*
マップキーとして。しかし、私の知る限り、あなたが申請した場合に保証はありません typeid
同じタイプの2つのオブジェクトには、同じものへの2つの参照が取得されます type_info
物体。
使用する場合 type_info*
マップキーとして、ポインターを挙げて比較するカスタムコンパレータを使用します。 type_info
オブジェクト自体(前述のものを使用します before()
また hash_code()
注文用)。
他のヒント
使用することもできます type_index, 、type_infoへのポインターを安全に保持します。コピー可能で同等のコピー可能で、標準容器にハッシュ機能が提供されます。