これができるかどうかはわかりませんが、テンプレートを掘り下げているだけなので、私の理解は少し間違っているかもしれません。
私は兵士の小隊を持っています。小隊はフォーメーションから継承してフォーメーションのプロパティを取得しますが、考えられる限り多くのフォーメーションを持つことができるため、CRTP を使用してフォーメーションを作成することにしました。小隊を格納する小隊のベクトルまたは配列。しかし、もちろん、小隊を作成すると、「タイプは無関係です」というベクトルに格納されません
これを回避する方法はありますか?似たような「ベニア」について読みましたが、それらは配列で動作しますが、動作させることができません。おそらく何かが足りないのでしょう。
ここにいくつかのコードがあります:(フォーマットについて申し訳ありません。コードは私の投稿にありますが、何らかの理由で表示されません)
template < class TBase >
class IFormation
{
public :
~IFormation(){}
bool IsFull()
{
return m_uiMaxMembers == m_uiCurrentMemCount;
}
protected:
unsigned int m_uiCurrentMemCount;
unsigned int m_uiMaxMembers;
IFormation( unsigned int _uiMaxMembers ): m_uiMaxMembers( _uiMaxMembers ), m_uiCurrentMemCount( 0 ){} // only allow use as a base class.
void SetupFormation( std::vector<MySoldier*>& _soldierList ){}; // must be implemented in derived class
};
/////////////////////////////////////////////////////////////////////////////////
// PHALANX FORMATION
class Phalanx : public IFormation<Phalanx>
{
public:
Phalanx( ):
IFormation( 12 ),
m_fDistance( 4.0f )
{}
~Phalanx(){}
protected:
float m_fDistance; // the distance between soldiers
void SetupFormation( std::vector<MySoldier*>& _soldierList );
};
///////////////////////////////////////////////////////////////////////////////////
// COLUMN FORMATINO
class Column : public IFormation< Column >
{
public :
Column( int _numOfMembers ):
IFormation( _numOfMembers )
{}
~Column();
protected:
void SetupFormation( std::vector<MySoldier*>& _soldierList );
};
次に、小隊クラスでこれらのフォーメーションを使用して派生させ、小隊が関連する SetupFormation() 関数を取得できるようにします。
template < class Formation >
class Platoon : public Formation
{
public:
**** platoon code here
};
この時点まで、すべてがうまく機能し、期待どおりです。
現在、将軍は複数の小隊を持つことができるため、小隊を保管する必要があります。
typedef Platoon< IFormation<> > TPlatoon; // FAIL
typedef std::vector<TPlatoon*> TPlatoons;
TPlatoon m_pPlatoons
m_pPlatoons.push_back( new Platoon<Phalanx> ); // FAIL, types unrelated.
typedef Platoon< IFormation<> > TPlatoon; テンプレート パラメーターを指定する必要があるため失敗しますが、これを指定すると、同じテンプレート パラメーターで作成された小隊しか保存できません。
だから私は FormationBase を作成しました
class FormationBase
{
public:
virtual bool IsFull() = 0;
virtual void SetupFormation( std::vector<MySoldier*>& _soldierList ) = 0;
};
それから IFormation をパブリックに継承させ、typedef を次のように変更しました。
typedef Platoon< IFormation< FormationBase > > TPlatoon;
しかし、まだ愛はありません。
今私の検索では、これが可能である、または不可能であるという情報は見つかりませんでした。