代码之家  ›  专栏  ›  技术社区  ›  smerlin

如何获取具有给定类名的未知类的对象

  •  3
  • smerlin  · 技术社区  · 15 年前

    我正在寻找一种方法,在运行时确定应该分配哪种类型的对象(基于给定的类名,类型为 const char* ).

    当然,最简单的方法就是使用大量的 if / 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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Kornel Kisielewicz    15 年前

    你就不能申报吗

    template<typename TBase, typename TDerived, typename TArg, typename... TArgs>
    

    ?

    typename TBase, typename TDerived, typename TArg
    
        2
  •  2
  •   Community CDub    7 年前

    把答案读一遍 here ,你可能需要一个工厂。

        3
  •  1
  •   Pavel Radzivilovsky    15 年前

    制作一个没有变量项的专用get_classobject()怎么样?这将停止递归。

    然后你会有一个变量模板的定义,还有一个 template<typename TBase, typename TDerived>

        4
  •  0
  •   Community CDub    7 年前

    这听起来像是在寻找经典的对象工厂模式。看看这个 stackoverflow question . 我个人喜欢这样 method