我有一个抽象基类和一个模板派生类。派生对象可以由派生对象的先前实例构造,例如一个整数。到目前为止,我们有
struct base {
/* ...pure virtual functions here... */
virtual ~base() = default;
/* NO DATA */
};
template <class D>
struct derived : base {
derived() = default;
derived(int x, const derived& previous) {
/* to construct I need access to previous.data_ */
}
/* ...overriden virtual functions here... */
~derived() = default;
D data_;
};
请注意,派生类的构造函数需要访问派生对象的data_
成员。previous
现在我想创建一个函数,它将derived<D>
通过将整数和 的前一个实例作为输入来构造类型的对象derived<D>
,并返回一个指向 的指针base
。问题是,由于用户将使用base
类指针,函数应该如下所示:
template <class D>
std::shared_ptr<base> getNext(int x, std::shared_ptr<base> current) {
return std::make_shared<derived<D>>(x, *current); /* ERROR */
}
正如您可能已经猜到的那样,这会产生一个编译错误,指出没有已知的从base
to转换derived<D>
。我知道我可以使用的一件事是 astatic_cast<derived<D>&>(*current)
因为基础对象的类型将始终是derived<D>
,但理想情况下,我希望尽可能避免任何强制转换。任何想法如何克服这个问题>?提前致谢!