基于模板的成员初始化,其中模板是抽象类的衍生物

Tam*_*abó 3 c++ templates class

我正致力于实现一种遗传算法,该算法应该适用于抽象基因组类型.

我的设置是这样的:

class AbstractGenome
{
  virtual void init() = 0;
  virtual void mutate() = 0;
  .
  .
  .
};

class GeneticAlgorithm
{
  std::vector<AbstractGenome*> genomes;

  void init(int numGenomes)
  {
    for (int i=0; i < numGenomes; ++i)
    {
      AbstractGenome *genome = new DerivedGenome(); <=This is where my problem is
      genome->init();
      genomes.push_back(genome);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

其中DerivedGenome稍后(在某些时候)定义为:

class DerivedGenome: public AbstractGenome
{
  void init() { do stuff; }
  void mutate() {do stuff; }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我对DerivedGenome的唯一了解是它派生自AbstractGenome - 因此我不能对DerivedGenome构造函数进行一般调用.

我能想到解决这个问题的一种方法是从GeneticAlgorithm派生并覆盖所有基因组类型的init函数,但我想知道是否有办法以更好的方式解决这个问题,例如通过模板?

非常感谢提前.

Bar*_*rry 5

您可以将DerivedGenome类型传递给init():

template <typename Derived>
void init(int numGenomes)
{
    for (int i=0; i < numGenomes; ++i)
    {
        AbstractGenome *genome = new Derived();
        genome->init();
        genomes.push_back(genome);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式致电:

init<DerivedGenome>(42);
Run Code Online (Sandbox Code Playgroud)

如果您想要尝试更明确的编译错误init<int>(5),可以将返回类型更改为要求继承:

template <typename Derived>
typename std::enable_if<
    std::is_base_of<AbstractGenome, Derived>::value
>::type init(int numGenomes) { .. }
Run Code Online (Sandbox Code Playgroud)