解决这个问题的一种传统方法是让对象克隆自己,再加上一点CRTP。
一、 首先,使抽象类可克隆:
struct Component {
virtual Component *clone() const = 0;
virtual ~Component() {}
};
现在,每个组件都应该定义自己的
clone()
。
二、可通过CRTP轻松实现自动化:
template<class Concrete> struct CompBase: Component {
Component *clone() const {
return new Concrete(static_cast<Concrete const &>(*this));
}
virtual ~CompBase() {}
};
struct Generator: CompBase<Generator>; // already has clone() defined
请注意,我在示例中使用了普通指针,但通常建议使用更智能的模拟。
std::unique_ptr
很合身,还有
std::make_unique
。
这创造了另一个机会:与
unique_ptr
您甚至可以忘记克隆,只需将unique\u ptr作为对象传递,每个对象内部都有自己的具体类实例,并将它们存储在向量中。