ここでは、やや良い答えです。私はティモの答えを変更したかったので、新しいものを提出しました。これの背後にある根拠は、魔法の数を避けることです。オリジナルのクラスを変更しないようにする目的で、新しい機能を追加するには、オブジェクトを型キャストしたり手をつけたりする必要があります。しかし、これは誰かが魔法の数字を使うことを許すべきではありません。
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;
}
}
潜在的な欠陥が1つあります。この考え方はおそらくうまくいかない。 2つのクラスの階層で試してみてください。 –
はい、欠点は、オブジェクトの型を最初に知っていなければならない正しい静的メンバーを取得することです。 –
仮想関数を使用して静的メンバーにアクセスする予定がない場合は、そうです。そうすれば、これは自家製の、非効率的な、慣れない、維持不能な、冗長なRTTIの実装になります。コンパイラがあなたに与えるものを手に入れてください。すでにそこにあります。 –