在派生类上使用工厂方法的模板

时间:2013-05-21 06:30:08

标签: c++ polymorphism

我有一个基类,其中会有许多派生类。但它是指向存储在程序中容器中的基类的指针,因此它可以迭代并调用它们上的虚函数。

我有另一个类将基类指针添加到此容器中,因此当派生类为new时(不是),它们必须返回或存储为基类指针。

我正在考虑制作一个简单的基类Factory方法,使用模板为我做这个:

    template<class T> //T is the derived class
    static T* Factory(){
       return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T));
    }

我看到两个主要优点/缺点:

优点:不需要为每个派生类重写此

缺点:通过传递T不是从我的基础派生的类类型,可能会错误地使用。

有没有办法确保在此函数T中派生Factory?或者我可以期望编译器捕获未派生T的实例吗?

这种一般方法是否可以接受,或者有更好的选择吗?

2 个答案:

答案 0 :(得分:2)

  

有没有办法确保T在此函数Factory中派生?

如果functionThatAddsBaseClassPointerToContainer需要Base*,则表示已完成。

Base* functionThatAddsBaseClassPointerToContainer(Base* b);  // <-- 

template<class T> //T is the derived class
static T* Factory(){
   // if T was not derived from Base, the following line fails to compile:
   return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T));
}

答案 1 :(得分:0)

您可以使用std::is_base_of在编译时确保这一点。假设您的基类名为Base

#include <type_traits>

template <typename T>
static T* Factory()
{
    static_assert(std::is_base_of<Base, T>::value, 
                 "Error: template parameter T in Factory is not derived from Base");
    return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T));
}

话虽这么说,通常工厂函数返回接口类型,而不是派生类型,所以在这种情况下你的设计有点奇怪。