我已经定义了以下模板:
//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>
吗?
答案 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)...);
}
};