オブジェクトの作成を管理するクラスWorld
があります...作成後、afterCreation
メソッドが呼び出され、作成されたオブジェクトはエンティティ(例えばMyEntity
)私はaddEntity
に電話したいと思う。私はオブジェクトが何か他のものだったので、私は何もしません。それはすべての派生クラスのためのユニークなIDを生成するので、 addEntity
等、適切なT
で呼び出さなければなりません。ここ特定の型から派生した型のテンプレートを特化する方法
は私のソリューションです:
template <int v>
struct ToType
{
enum { value = v };
};
template <typename T>
void World::afterCreation(T * t)
{
afterCreation(t, ToType<std::is_base_of<Entity, T>::value>());
}
template <typename T>
void World::afterCreation(T * t, ToType<true>)
{
addEntity(t); //here I cant pass Entity *, I need the real type, eg. MyEntity
}
template <typename T>
void World::afterCreation(T * t, ToType<false>)
{
}
私の質問をされた - でより良い方法を行うことができますか?
ToType
またはそれに類するものを除いて、次のコードをどのようにシミュレートできますか?
template <typename T>
void afterCreation(){/*generic impl*/}
template <typename T where T is derived from Entity>
void afterCreation(){/*some specific stuff*/}
- タイトルに「特化」のみ、あなたが多型のポインタでこれを行うことができますテンプレートの特殊
Eddie Edwards:実行したいオブジェクトのポインタを渡すだけです。 'エンティティx; afterCreation(&x); '。 – orlp
+1、シンプルでポイントに:)実際に問題を解決するのではなく、SFINAEよりはるかに簡単なアプローチで解決します。 Entity'の派生型、つまり、entity-derivedEntityName()のようなものはありません。これは、Entity以外の派生型ではコンパイルできません) –
申し訳ありませんナイトクラッカー申し訳ありません。コンパイラの多くはdynamic_castを削除します。これは、xの型の完全な知識を持っているからです。あるいは、テンプレート化されたソリューションがまったく動作することができると仮定して、少なくとも必要な知識が必要です。 –