#include <memory>
class Base
{
std::shared_ptr<Base> create() const; // Returns a default constructed object
}
假设从Base
获得的任何程度的所有成员都是可复制构造和默认构造的。
std::shared_ptr<Base> create() const;
创建适当动态类型的对象的方法,但我不想使用样板代码。
是否可以制作
std::shared_ptr<Base> create() const;
静态绑定,但是在内部找到正确的类型并使用Default构造函数创建对象?可能使用C ++ 11。
答案 0 :(得分:1)
create()
函数可能应该是静态的,因为您还没有实例。但是如果没有参数,你就无法做你想做的事情......除非你使用模板,当然:
class Base
{
public:
template<typename T>
static std::shared_ptr<Base> create() const
{
return std::shared<Base>(new T);
}
};
然后以这种方式使用它:
std::shared_ptr<Base> ptr(Base::create<Foo>());
或者,如果您愿意:
std::shared_ptr<Base> ptr(Foo::create<Foo>());
答案 1 :(得分:1)
理想情况下,您有一个静态的,可能是非静态的create()
函数。有一种聪明的方法可以实现这一目标。
定义SuperBase
课程。它需要一个虚拟析构函数和一个纯虚拟create()
函数。您将使用此类的指针/引用来进行正常的后期绑定OOP行为。
定义继承自Base
的{{1}}类模板。 SuperBase
的模板参数将是Base
类的类型。 Derived
还将有一个traits类模板,其中包含一个名为Base
的静态函数。此静态create()
函数将使用create()
创建默认对象。使用特征的new
函数,create()
将定义Base
和纯虚拟static_create()
函数。
通过继承SuperBase::create()
来实施Derived
。
如果您知道自己使用的是派生类型,则可以编写Base<Derived>
来静态创建新类型。如果没有,那么您始终可以使用实例的Derived::create()
方法。多态性没有被打破,因为create()
将具有您需要/想要的多态接口 - SuperBase
只是一个自动定义Base<D>
和static_create()
函数的辅助类,所以你会通常不直接使用create()
。
示例代码如下所示:
Base<D>