8

私はまだ、One-Of-A-Type コンテナーの問題に対する適切な解決策に取り組んでいますstd::map<std::type_info, boost::any>。残念ながら、std::type_infoは を定義していません。定義するのはoperator<不合理だと思います。

std::type_infoただし、オブジェクトのシングルトン アドレスを妥当な "ハッシュ" として単純に使用できるため、ハッシュ関数を定義することは合理的と思われます。std::type_infoしたがって、 astd::unordered_mapをキーとしてa に入れることができます。

C++11 はそのようなハッシュ関数を提供しますか? シングルトンのメモリアドレスを使用するstd::type_infoことは、ハッシュ戦略として不適切でしょうか?

4

2 に答える 2

13

type_indexを使用することもできます。これは、type_infoへのポインターを安全に保持し、コピー可能で比較可能であり、標準コンテナー用にハッシュ関数が提供されています。

于 2012-11-19T15:32:31.907 に答える
9

比較可能であるという事実type_infoは、それをマップキーとして使用する上で、type_infoコピーできないという事実ほど問題ではありません。:-)

C++03 では、オブジェクトの順序付けを提供するメンバー関数がありtype_infoます。before()type_info

C++11 ではtype_infohash_code()メンバー関数があります (C++11 §18.7.1/7):

size_t hash_code() const throw();

戻り値:指定されていない値。ただし、プログラムの 1 回の実行内で、type_info等しいと比較された任意の 2 つのオブジェクトに対して同じ値を返すものとします。

注意:type_info実装は、比較が等しくない2 つのオブジェクトに対して異なる値を返す必要があります。

type_info演算子の結果のオブジェクトtypeidはプログラムの最後まで存在するため、type_info*a をマップ キーとして使用しても安全です。ただし、私の知る限りでtypeidは、同じ型の 2 つのオブジェクトに適用した場合、同じtype_infoオブジェクトへの 2 つの参照が得られるという保証はありません。

マップキーとして使用する場合は、ポインターを逆参照し、オブジェクト自体type_info*を比較するカスタムコンパレーターを使用します(前述または順序付けを使用)。type_infobefore()hash_code()

于 2010-08-23T22:32:31.010 に答える