2016-04-01 12 views
-1

私が扱っている小さなテンプレートシナリオがあります。ここにその設定があります。 C++ - 派生型をテンプレートパラメータとして取得する

class Base { 

} 

class Derived : Base { 

}; 

そして、私のユースケース:

void DoAThing(Base* t) { 
    DoAnotherThing(*t); 
} 

template<typename T> 
void DoAnotherThing(T& t) { 
} 

それでは、私は期待していた私はそれを通過するとき、私はその後、私の「DoAThing」に派生型を渡すことができ、およびというものでしたDoAnotherThing、テンプレートパラメータはDerivedとして表示されます。逆参照された型は、派生型としてtypeidによって確実に解決されますが、DoAnotherThingのT型は常にBaseとして渡されます。 DoAnotherThingが私が送る派生型に解決するようにこれを操作できる方法はありますか?

編集:これまでの回答をありがとうございますが、私の使用例ではまだ解決していません。 DoAnotherThingは実際にDerivedクラスのコンテナを作成することですが、問題はコンテナの種類がコンテナではなくコンテナとして終了することです。 DoAThingは、呼び出されるシナリオのテンプレートではなく、引き続きBaseを取り込むことを望みます。

+2

多型の正確な型を知る必要がある場合は、間違っていることがよくあります。どのような場合でも、テンプレートはコンパイル時の多態性、継承は実行時の多型性のためのもので、2つを混同しているようで、正確に何をしようとしているのか説明する必要があります。 – user657267

+0

DoAThingはTでもテンプレート化する必要があります –

答えて

1

あなたの例によると、基本クラスへのポインタを持つDoAThingメソッドから派生クラスへのポインタを持つDoAnotherThing関数を呼び出すには、上部キャストを行う必要があります。これを実現するには2つのオプションがあります:
1)RTTIを使用して実数型を取得しますが、実行時に必要です。
2)このメソッドをhttp://arturx64.github.io/programming-world/2015/02/05/lazy-visitor.htmlにすると、RTTIなしで上位キャストを作成できます。

関連する問題