2012-03-25 23 views
20

クラスBaseとクラスDerived_1,... IDを持つには派生クラスが必要です。これらのIDは、さらなるルックアップなどに使用されるため、連続する必要があります(乱数だけではありません)。派生クラスはユーザーによって作成されるため、IDはDerived_Nのメンバーになることはできません。だから私はDerivedTypeクラスを思いついた。データ型(クラス型)をキーとしてキーとして使用

class DerivedType 
{ 
    static unsigned id; 
    unsigned m_id; 
public: 
    DerivedType() : m_id(id++) { } 
} 

は今、私はDerived_NDerivedTypeとの間のマッピングを作成します。 Derived_Nが作成されるたびに、このマッピングは、Derived_NDerivedTypeがすでに存在するかどうかを調べてそれを返します。そうでない場合は、新しいマップを作成してマップに保存します。

実際の質問: マップでキーとしてデータ型std::mapを使用する方法はありますか? 私はテンプレート - メタプログラムソリューションを恐れていません。 または私の目標を達成するためのエレガントな方法はありますか? -

編集 Date型>データ型、私が意味するClassTypeのように、私は私が好きな、それを使用したい

:)申し訳ありません:

Derived_5 d; 
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType 
dt.getId(); 

Derived_Nのすべてのインスタンス(同じで " N ')DerivedType

EDIT2 throu同じIDを持っている必要があります - 私の答え 私はそれは、Liである...私の問題のためのよりよい解決策を見つけましたKEこの:

atomic_counter s_nextEventClassID; 

typedef int cid_t; 

template<class EventClass> 
class EventClassID 
{ 
public: 
    static cid_t getID() 
    { 
     static cid_t classID = EventClassID::next(); 
     return classID; 
    } 

    static cid_t next() { return ++s_nextEventClassID; } 
}; 

私の質問は、マップ内のデータ型を使用する方法だったので、私はあなたに感謝し、あなたの答えの一部をマークします

答えて

43

C++ 11連想コンテナ内のキーとして使用することができるstd::type_infoオブジェクトから構築、コピー可能同等とハッシュ可能オブジェクトである、<typeindex>に、std::type_indexを提供することによって、これを解決します。

(実装は非常に簡単なので、C++ 11を自分で持っていなくても、GCC 4.7から実装を盗み出して自分のコードで使うことができます。)

#include <typeindex> 
#include <typeinfo> 
#include <unordered_map> 

typedef std::unordered_map<std::type_index, int> tmap; 

int main() 
{ 
    tmap m; 
    m[typeid(main)] = 12; 
    m[typeid(tmap)] = 15; 
} 
+1

これは受け入れられる回答である必要があります – jupp0r

+0

最新のC++を使用する非常に良い答え – Anonymous

0
あなたは std::mapへの鍵としてあなたが好きなタイプやクラスを使用することができます

テンプレート引数に、基になるツリーをどのようにソートするかを指示する比較関数を与えなければなりません。

IMHOを使って日付をキーとして表現するのが最も簡単なことは、それらをUnixのタイムスタンプに変換することですが、そのクラス表現が何であるかにかかわらず、マップの定義に比較関数を渡すだけです行く。

13

type_info::beforeがあるので、typeid(object)を直接使用することができます。これは、type_infoをキーとして使用するとコンパレータとして使用できます。What is `type_info::before` useful for?を参照してください。 .name()を取得する必要はありません。

関連する問題