2

これができるかどうかはわかりませんが、テンプレートを掘り下げているだけなので、私の理解は少し間違っているかもしれません。

私は兵士の小隊を持っています。小隊はフォーメーションから継承してフォーメーションのプロパティを取得しますが、考えられる限り多くのフォーメーションを持つことができるため、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;

しかし、まだ愛はありません。

今私の検索では、これが可能である、または不可能であるという情報は見つかりませんでした。

4

1 に答える 1

2

C ++では、コンパイル時と実行時のポリモーフィズムを単純に使用することはできません。あなたのベクトルは1つのタイプしか保持できないという点で正しいです。ベクトルに非テンプレート型へのポインタを格納させるか、ベクトルを使用しないようにデザインを変更する必要があります。

CRTPされたクラスをから公に継承させたい場合はFormationBase、ベクトルは。である必要がありstd::vector<FormationBase *>ます。ランタイムクラスFormationBaseから、インスタンス化されたコンパイル時テンプレートパラメータに戻ることはできません。

データが比較的一貫しているように見え、アルゴリズムが戦場で兵士とユニットを配置する方法を変更したいだけであることを考えると、戦略パターンを使用してSetupFormation関数を指定し、保存したものを使用して別の非多形クラスを作成することを検討します。ベクトルで。

于 2010-06-15T02:46:40.307 に答える