我在Cloneable/CloneableImpl
下面有一对工人阶级。只要我有从子到父的默认构造函数,它就可以完成它的工作。
假设 Animal 的构造函数被修改为Animal( std::string const& name )
,这需要从子类构造函数中传递名称。
如何在保持Cloneable/CloneableImpl
通用性的同时将此要求合并到结构中?
换句话说,我需要能够将所有构造函数参数从 Lion、Tiger 转发到 Animal。有没有办法在 C++11 中以通用方式做到这一点?
如果不可能,如何在允许构造函数要求的同时重组这些模板以保持通用性?
代码
template<typename P>
struct Cloneable
{
virtual P* clone() const = 0;
};
template<typename T,typename P>
struct CloneableImpl :
public P
{
virtual P* clone() const
{
return new T( dynamic_cast<T const&>(*this));
}
};
// ----------------------------------------------------------------------------
struct Animal :
public Cloneable<Animal>
{
};
struct Lion :
public CloneableImpl<Lion,Animal>
{
};
struct Tiger :
public CloneableImpl<Tiger,Animal>
{
};
int
main( int argv, char* argc[] )
{
Animal* x = new Lion;
Animal* y = x->clone();
// we want to do this without hard-coding in template classes
// Animal* z = new Lion( "Samba" );
}