質問

私はまだ自分の良い解決策に取り組んでいます ユニークなタイプのコンテナの問題 - そして、反省すると、 std::map<std::type_info, boost::any>. 。不運にも、 std::type_info 定義しません operator<, 、そして、私はそれがそれを定義するのは不合理だと思います。

ただし、ハッシュ関数を定義することは合理的に思えます。 std::type_info 合理的な「ハッシュ」としてのオブジェクト。したがって、あなたはaを置くことができるでしょう std::type_infostd::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へのポインターを安全に保持します。コピー可能で同等のコピー可能で、標準容器にハッシュ機能が提供されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top