2

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

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

我正在考虑使用模板为我做一个简单的基类工厂方法:

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

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

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

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

有没有办法确保T在这个函数内部派生Factory?或者我可以期望编译器捕获T不是派生的实例吗?

这种通用方法是一个可以接受的想法,还是有更好的选择?

4

2 回答 2

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));
}
于 2013-05-21T06:39:53.097 回答
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));
}

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

于 2013-05-21T06:35:42.033 回答