マップ内のいくつかのデータをタイプ別に入力する必要があります。現在、私はこのようなものを持っています:
struct TypeInfoComparer
{
bool operator()(std::type_info const* a, std::type_info const* b) const
{
return a->before(*b);
};
};
std::map<std::type_info const*, Foo, TypeInfoComparer> d_fooByTypeId;
次に、これを使用して検索できます(たとえば、<typename T>
を持つテンプレートメソッドで:
auto pair = d_fooByTypeId.find(&typeid(T));
しかし、今日私は std::type_index
について読んでいました。これはこのような場合に使用することを意図しているようです。
C++の知識を向上させることに興味があります。誰かがstd::type_index
を使用するようにコードを変更する必要があるかどうか、およびその理由を説明できますか? TypeInfoComparer
を削除できる以外に理由はありますか?
type_index
は、「連想コンテナ(23.4)および順序付けされていない連想コンテナ(23.5)でインデックス型として使用できるtype_infoの単純なラッパー」です。 type_index
の代わりにtype_info*
を使用すると、マップに明示的なコンパレータを提供する必要がなくなります。唯一のコストは、#include <typeindex>
する必要があるということです。
もう1つの利点は、ハッシュマップ(別名unordered_maps)に切り替える(または使用する)ことができることです。
全体として、コードが単純化されるので、「頑張ってください」と言います。
typeid(x)
から返された結果へのポインターを使用しても、常に同じ結果が得られるとは限りません。特に、共有ライブラリが使用されたときに同じオブジェクトが返されることを保証することは問題があるようです。ソートのための_std::type_info
_の使用目的は、before()
メンバーを使用することです。クラス_std::type_index
_は、これをシモラーインターフェイスにラップします。