c – 如何使用给定的类名获取未知类的对象
作者:互联网
我正在寻找一种方法来确定在运行时应该分配哪种类型的对象(基于给定的类名,类型为const char *).
那么最简单的方法当然是使用ifs / else ifs的负载,但这似乎不适用,因为我有> 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()的输出是特定于编译器/实现的.
在所有Derived类中使用静态const char * name变量或函数,可以解决这个问题,但会增加一些工作(当然你可以使用宏来实现,但如果你已经使用了宏,你也可以使用另一个对象工厂方法)
解决方法:
你能不能宣布
template<typename TBase, typename TDerived, typename TArg, typename... TArgs>
?
然后你可以专门针对这种情况
typename TBase, typename TDerived, typename TArg
标签:function-templates,c,c11 来源: https://codeday.me/bug/20190827/1741907.html