web-dev-qa-db-ja.com

std :: type_info *の代わりにstd :: type_indexを使用する理由

マップ内のいくつかのデータをタイプ別に入力する必要があります。現在、私はこのようなものを持っています:

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を削除できる以外に理由はありますか?

27
Drew Noakes

type_indexは、「連想コンテナ(23.4)および順序付けされていない連想コンテナ(23.5)でインデックス型として使用できるtype_infoの単純なラッパー」です。 type_indexの代わりにtype_info*を使用すると、マップに明示的なコンパレータを提供する必要がなくなります。唯一のコストは、#include <typeindex>する必要があるということです。

もう1つの利点は、ハッシュマップ(別名unordered_maps)に切り替える(または使用する)ことができることです。

全体として、コードが単純化されるので、「頑張ってください」と言います。

22
rici

typeid(x)から返された結果へのポインターを使用しても、常に同じ結果が得られるとは限りません。特に、共有ライブラリが使用されたときに同じオブジェクトが返されることを保証することは問題があるようです。ソートのための_std::type_info_の使用目的は、before()メンバーを使用することです。クラス_std::type_index_は、これをシモラーインターフェイスにラップします。

6
Dietmar Kühl