我有一个基类,其中会有许多派生类。但它是指向存储在程序中容器中的基类的指针,因此它可以迭代并调用它们上的虚函数。
我有另一个类将基类指针添加到此容器中,因此当派生类为new
时(不是裸),它们必须返回或存储为基类指针。
我正在考虑制作一个简单的基类Factory方法,使用模板为我做这个:
template<class T> //T is the derived class
static T* Factory(){
return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T));
}
我看到两个主要优点/缺点:
优点:不需要为每个派生类重写此
缺点:通过传递T
不是从我的基础派生的类类型,可能会错误地使用。
有没有办法确保在此函数T
中派生Factory
?或者我可以期望编译器捕获未派生T
的实例吗?
这种一般方法是否可以接受,或者有更好的选择吗?
答案 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));
}
话虽这么说,通常工厂函数返回接口类型,而不是派生类型,所以在这种情况下你的设计有点奇怪。