是否可以创建非虚拟创建方法

时间:2012-07-20 18:46:58

标签: c++ c++11 rtti

#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。

2 个答案:

答案 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()函数。有一种聪明的方法可以实现这一目标。

  1. 定义SuperBase课程。它需要一个虚拟析构函数和一个纯虚拟create()函数。您将使用此类的指针/引用来进行正常的后期绑定OOP行为。

  2. 定义继承自Base的{​​{1}}类模板。 SuperBase的模板参数将是Base类的类型。 Derived还将有一个traits类模板,其中包含一个名为Base的静态函数。此静态create()函数将使用create()创建默认对象。使用特征的new函数,create()将定义Base和纯虚拟static_create()函数。

  3. 通过继承SuperBase::create()来实施Derived

  4. 如果您知道自己使用的是派生类型,则可以编写Base<Derived>来静态创建新类型。如果没有,那么您始终可以使用实例的Derived::create()方法。多态性没有被打破,因为create()将具有您需要/想要的多态接口 - SuperBase只是一个自动定义Base<D>static_create()函数的辅助类,所以你会通常不直接使用create()

    示例代码如下所示:

    Base<D>
相关问题