2012-04-18 20 views
2

私は、フレームワークのためのクラスの大きな階層を開発しています。これは、完了するとかなり多くの型変換が必要になります。C++のdynamic_castと静的列挙型のオブジェクト型の格納

私の質問は、列挙型を使用して階層内のすべてのオブジェクト型を格納する静的メンバを作成することです。メンバをすべてのクラスに対して静的にすると、インスタンス化されたオブジェクトのサイズは増加せず、実行時にdynamic_castよりもオブジェクトの型を判別する(潜在的に)高速になります。

少なくとも基本的な考えです。このアプローチはどれだけ適切であり、潜在的な欠陥があるか?

+0

潜在的な欠陥が1つあります。この考え方はおそらくうまくいかない。 2つのクラスの階層で試してみてください。 –

+0

はい、欠点は、オブジェクトの型を最初に知っていなければならない正しい静的メンバーを取得することです。 –

+0

仮想関数を使用して静的メンバーにアクセスする予定がない場合は、そうです。そうすれば、これは自家製の、非効率的な、慣れない、維持不能な、冗長なRTTIの実装になります。コンパイラがあなたに与えるものを手に入れてください。すでにそこにあります。 –

答えて

2

オブジェクト間で共有される静的変数から、各オブジェクトのタイプをどのように決定するのか分かりません。いくつかの大きさより高速dynamic_castをより

struct Base 
{ 
    virtual int type() = 0; 
}; 

struct Derived1 : public Base 
{ 
    virtual int type() { return 1; } 
}; 

struct Derived2 : public Base 
{ 
    virtual int type() { return 2; } 
}; 

ない最速のソリューション、しかし:あなたは、クラスごとにオーバーライドするいくつかの仮想関数を持っているが、その後、あなたがすべてで静的変数を必要としない場合を除き、ちょうどこのような何かを行いますまたはtypeid

+0

これは正確に質問に答えますが、OPが達成しようとしていることについてはまだ質問を残しています... – Chad

0

ここでは、やや良い答えです。私はティモの答えを変更したかったので、新しいものを提出しました。これの背後にある根拠は、魔法の数を避けることです。オリジナルのクラスを変更しないようにする目的で、新しい機能を追加するには、オブジェクトを型キャストしたり手をつけたりする必要があります。しかし、これは誰かが魔法の数字を使うことを許すべきではありません。

enum mytypeid { 
    DERIVED1, 
    DERIVED2, 
}; 

struct Base 
{ 
    virtual mytypeid type() = 0; 
}; 

struct Derived1 : public Base 
{ 
    static const mytypeid mytype = DERIVED1; 

    virtual mytypeid type() { return mytype ; } 
}; 

struct Derived2 : public Base 
{ 
    static const mytypeid mytype = DERIVED2; 

    virtual mytypeid type() { return mytype ; } 
}; 

//... 

void fn(Base &a) { 
    if(a.type() == Derived1::mytype) { 
     std::cout<<"1"<<std::endl; 
    } 
} 
関連する問題