我有以下基类:
class Base abstract
{
public:
virtual ~Base() {};
protected:
Base() {};
virtual bool Initialize() abstract;
};
在扩展非抽象的类时,我总是定义静态的Create函数。
class Next : public Base
{
public:
static Next* Create(/*eventual params*/);
~Next() {};
protected:
Next(/*eventual params*/) {};
virtual bool Initialize() {/*...*/};
};
创建功能看起来总是,如下所示:
Next* Next::Create(/*eventual params*/)
{
bool succes;
Next* next = new Next(/*eventual params - same as above*/);
succes = next->Initialize();
if(!succes)
{
return NULL;
}
return next;
}
我的问题是;是否有可能缩短此功能?例如,使用模板或将其关闭一行?
答案 0 :(得分:4)
只是在函数中使用模板来创建泛型类并在其中调用一些函数很简单,你遇到的问题是/*eventual params*/
部分。您可以使用名为parameter packs的内容来解决此问题,也称为variadic templates。
也许是这样的:
template<typename T, typename ...A>
T* create(A... args)
{
T* object = new T(std::forward<A>(args)...);
if (object->Initialize())
return object;
delete object;
return nullptr;
}
您的示例类Next
可以像
Base* pointer_to_next = create<Next>(/* eventual arguments */);
当然,它需要C ++ 11。