我正在研究应该用于抽象基因组类型的遗传算法的实现。
我的设置是这样的:
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);
}
}
}
其中,DerivedGenome稍后(在某个时候)定义为:
class DerivedGenome: public AbstractGenome
{
void init() { do stuff; }
void mutate() {do stuff; }
}
我的问题是,我对DerivedGenome唯一了解的是它是从AbstractGenome派生的-因此,我无法对DerivedGenome构造函数进行一般性调用。
我想解决这个问题的一种方法是从GeneticAlgorithm派生并覆盖所有基因组类型的init函数,但是我想知道是否有办法更好地解决此问题,例如通过模板?
非常感谢。
最佳答案
您可以将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);
}
}
您可以通过以下方式致电:
init<DerivedGenome>(42);
如果您想要更明确的编译错误,以防您尝试执行
init<int>(5)
,则可以更改return-type以要求该继承:template <typename Derived>
typename std::enable_if<
std::is_base_of<AbstractGenome, Derived>::value
>::type init(int numGenomes) { .. }