ヘッダーファイルで次のテンプレート関数を定義しています。
template <class T> T* spawnEnemy(SpawnDirection dir);
私の意図は、テンプレートパラメータとして敵のタイプを受け入れる汎用のスポーン関数を作成し、関数からスポーンされたオブジェクトを返すことです。
以下は間違った実装ですが、私はそれを使って私が達成したいことを表現しています。
template <class T> T* ObjectSpawner::spawnEnemy(SpawnDirection dir)
{
if(_enemiesPool->isAnyFreeObjects())
{
T* enemy = NULL;
if(typeof(T*) == Zombie01) // This line is INCORRECT
enemy = dynamic_cast<T*>(_enemiesPool->popFreeObjectAndAddToActiveListForType(ZOMBIE));
else if ...
return enemy;
}
else
return NULL;
}
つまり、Tから型チェックができる必要があるので、関数を適切に呼び出すことができます。
popFreeObjectAndAddToActiveListForType(int type)
入力として正しい値を使用します。
では、このような状況でテンプレート関数内で型チェックを行うにはどうすればよいですか?
編集:スティーブン・リンとnvoigtから提案を受けた後、このデザインには欠陥があることがわかりましたが、それは私がすでに持っているものからそれを補充しているためです。より簡単なのは、関数に別の型パラメーターを持たせ、テンプレートに関与させないようにすることですが、後で特定の型にキャストする必要があります。とにかく、この状況の解決策を知ることは良いことです。