其他分享
首页 > 其他分享> > c – 如何使用给定的类名获取未知类的对象

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