この質問が少し紛らわしい場合は申し訳ありません。私は本当に学習目的を求めており、これが可能になる方法があるかどうかを確認しています。
以下のクラスでは、CreateObject()とGetObject()のテンプレートパラメータを指定する必要があります。
class ObjectManager
{
public:
template <class T>
void CreateObject(int id)
{
//Store pointer to newly created object in a map
}
template <class T>
T* GetObject(int id)
{
//Find object using id and return a T* to it
}
};
CreateObject()は、テンプレートパラメータを使用して正しいタイプのオブジェクトを作成し、そのオブジェクトへのポインタをマップに格納します。GetObject()は、テンプレートパラメータを使用して、目的のタイプのポインタを返します。一部のオブジェクトでは、GetObject()が実際のオブジェクトタイプへのポインタを返すようにします。他のオブジェクトの場合、GetObject()が親型へのポインターを返すようにします。
今のところ、GetObject()を呼び出すときはいつでも、タイプを指定する必要があります。
SomeType* pST = m_objectManager.GetObject<SomeType>(id);
AnotherType* pAT = m_objectManager.GetObject<AnotherType>(id);
私の目標は、CreateObject()関数のテンプレートパラメーターとして、実際のオブジェクトタイプと目的のリターンタイプを指定することです。
class ObjectManager
{
public:
template <class T, class DesiredReturnType>
void CreateObject(int id)
{
//Store pointer to newly created object of type T in a map
//The DesiredReturnType would be used by GetObject() to return the correct type of pointer
}
//This isn't possible but would be ideal.
DesiredReturnType* GetObject(int id)
{
//Return a DesiredReturnType* to the object
}
};
m_objectManager.CreateObject<SomeType, ParentOfSomeType>(id);
//Now I don't need to specify a template argument when calling GetObject().
//CreateObject() will create a new SomeType.
//GetObject() will return a ParentOfSomeType* which is really pointing to a SomeType object
ParentOfSomeType* pPST = m_objectManager.GetObject(id);
すべてのオブジェクトには異なるタイプと異なる目的の戻りタイプがあるため、クラステンプレートパラメーターを使用することはできません。タイプと目的のリターンリターンタイプは、作成したオブジェクトのタイプに応じて常に変化します。
このようなことは可能でしょうか?このような状況で役立つデザインパターンはありますか?
編集:
デザインを選んだ理由は以下のとおりです。親*と子*のどちらを受け取るかによって動作が異なる別の関数を呼び出します。
テンプレートの引数をとることで、次のようなことができるのではないかと思いました。
for(int id = 0; id < 10; id++)
MyFunction(m_objectManager.GetObject(id));
それが悪い決定の選択であるという事実をおそらく変えないでしょう、しかし私は主に好奇心から尋ねています。:)