模板静态创建功能

时间:2015-12-10 08:59:33

标签: c++

我有以下基类:

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;
}

我的问题是;是否有可能缩短此功能?例如,使用模板或将其关闭一行?

1 个答案:

答案 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。