在该静态成员函数的基类中定义了该静态成员函数的同时,您可以通过unique_ptr返回派生类的实例吗?

时间:2019-02-14 15:50:45

标签: c++

我已经定义了以下模板:

//template.h
template <typename E>
class Base{
public:
    Base(const E& identifier);
protected:
    E m_identifier;
}

我将此模板与QObject一起使用作为基类,请参见下面的代码段:

//state.h
#include "template.h"

template class Bases<StateIdentifier>;
class State : public QObject, public Base<StateIdentifier>
{
    Q_OBJECT
public:
...
}

上面的类State再次用作基类,请参见下面的代码段:

//explicit_state.h
#include <memory>
#include "state.h"

class Init : public State
{
public:
    static std::unique_ptr<Init> generateState()
...
}

现在,可以有许多源自State的“显式状态”。我可以将generateState的静态成员Init移到State以便遵守DRY原则吗?仍然让它返回一个std::unique_ptr<Init>(或任何从State派生的类)。

简而言之:

//state.h
#include "template.h"

template class Bases<StateIdentifier>;
class State : public QObject, public Base<StateIdentifier>
{
    Q_OBJECT
public:
    static std::unique_ptr<State> generateState() //moved here from Init below
...
}

class Init : public State
{
public:
    //static std::unique_ptr<Init> generateState() 
...
}

我现在可以打电话给Init:generateState()并期望它返回一个std::unique_ptr<Init>吗?

1 个答案:

答案 0 :(得分:0)

使用模板功能,您可以执行以下操作:

template class Bases<StateIdentifier>;
class State : public QObject, public Base<StateIdentifier>
{
    Q_OBJECT
public:
    template <typename T, typename ... Ts>
    static std::unique_ptr<T> generateState(Ts&&...args)
    {
        static_assert(std::is_base_of<State, T>::value);
        return std::make_unique<T>(std::forward<Ts>(args)...);
    }
};