下に労働者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" );
}