在向量中存储基于CRTP的类时遇到问题

时间:2010-06-15 02:35:26

标签: c++ storage containers crtp

我不确定是否可以这样做,我只是钻研模板,所以也许我的理解有点不对。

我有一排士兵,排从一个阵地继承以获得编队属性,但因为我可以拥有尽可能多的编队,我选择使用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&lt;见识&LT;&GT; &GT; TPlatoon;失败,因为我需要指定一个模板参数,但指定这个只允许我存储使用相同模板参数创建的排。

所以我创建了FormationBase

class FormationBase
{
public:
    virtual bool IsFull() = 0;
    virtual void SetupFormation( std::vector<MySoldier*>& _soldierList ) = 0;
};

并使IFormation公开继承,然后将typedef更改为

typedef Platoon< IFormation< FormationBase > > TPlatoon;

但仍然没有爱。

现在在我的搜索中,我还没有找到可以说这是可能的信息 - 或者不可能。

1 个答案:

答案 0 :(得分:2)

C ++不允许简单地使用编译时和运行时多态。你是正确的,因为你的向量只能容纳一种类型。您将不得不让向量存储指向非模板类型的指针,或者将设计更改为不使用向量。

如果您希望CRTP的类公开继承自FormationBase,那么该向量必须是std::vector<FormationBase *>。从运行时类FormationBase返回到它实例化的编译时模板参数是不可能的。

考虑到你的数据看起来相对一致,你只想改变你的算法如何在战场上安排士兵和单位,我会考虑使用策略模式来指定SetupFormation函数,并使用一个单独的非多态类你存储在矢量中。