我正在寻找一种方法来确定在运行时应该分配哪种类型的对象(基于给定的类名,它是 type const char*
)。
好吧,最简单的方法当然是使用大量的if
s / else if
s,但这似乎不适用,因为我有超过 100 个不同的类(至少它们都派生自一个基类),而且我必须定期添加新类以及。
我已经提出了初稿,但遗憾的是它还没有编译(mingw & g++ 4.4)
template<typename TBase, typename TDerived, typename... TArgs>
Base* get_classobject(const char* classname)
{
if(strcmp(classname,typeid(TDerived).name())==0)
return new TDerived; //
else if(sizeof...(TArgs)>0)
return get_classobject<TBase,TArgs...>(classname);
else
return 0;
}
int main()
{
Base* obj = get_classobject<Base,A,Foo,B,C>("Foo");
// ^- Types A B C and Foo are all derived from Base
delete obj; //of course we got an virtual dtor ;)
return 0;
}
但这并不能sizeof...(TArgs)>0
阻止 gcc 尝试生成get_classobject<TBase,const char*>(const char*)
失败的代码
您有任何想法,如何解决此问题或任何其他想法吗?谢谢。
编辑:我解决了:
template<typename TBase, typename TDerived>
Base* get_classobject(const char* classname)
{
if(strcmp(classname,typeid(TDerived).name())==0)
return new TDerived;
return 0;
}
template<typename TBase, typename TDerived, typename TArg, typename... TArgs>
Base* get_classobject(const char* classname)
{
if(strcmp(classname,typeid(TDerived).name())==0)
return new TDerived;
return get_classobject<TBase,TArg,TArgs...>(classname);
}
编辑对于感兴趣的读者:
您现在应该知道上面的实现根本不是独立于编译器的。的输出typeif(sometype).name()
是特定于编译器/实现的。在所有派生类中使用static const char* name
变量或函数可以解决此问题,但会增加大量工作(当然您可以为此使用宏,但如果您已经在使用宏,您也可以使用另一个对象工厂方法)