C++ 检查对象是T的类型还是子类型,T存储为字符串

C++ 检查对象是T的类型还是子类型,T存储为字符串,c++,templates,inheritance,dynamic-cast,C++,Templates,Inheritance,Dynamic Cast,当我试图检查一个对象是否是另一个对象的子类时,我遇到了一个小问题。我知道是的基础,是相同的方法,但它们不能满足我的需要。事情是这样的: 我有一个多态对象(组件)std::list,以及一系列作用于这些容器的模板方法。 getComponent()、getComponents()、getComponentOfType()… T*getComponent():从容器中检索任何类型为T的组件(如果存在)。否则,返回nullptr 它处理一个对象和一个类型T:我使用了boost::typeindex::

当我试图检查一个对象是否是另一个对象的子类时,我遇到了一个小问题。我知道
的基础,
是相同的
方法,但它们不能满足我的需要。事情是这样的:

我有一个多态对象(组件)
std::list
,以及一系列作用于这些容器的模板方法。
getComponent()、getComponents()、getComponentOfType()…

  • T*getComponent():
    从容器中检索任何类型为T的组件(如果存在)。否则,返回
    nullptr
  • 它处理一个对象和一个类型
    T
    :我使用了boost::typeindex::Type\u index

  • std::list getComponents():
    std::list getComponentsOfType()
    分别是
    getComponent()
    getComponentOfType()的列表版本
  • 然而,其余方法需要处理对象对象,或对象字符串

    例如,名为
    bool check\u singleton(Component*c)
    的方法检查容器是否具有
    c
    类型或子类型的组件

    注意:
    c是多态的
    check\u singleton
    使用一个字符串列表,其中包含必须是singleton的所有组件<代码>标准::列表

    可表示为:

    对象继承“ClassName”

    多谢各位。
    诚恳地说。

    不太好。模板在编译期间进行评估。std::字符串只能在运行时编译时读取。您可以查看
    boost::mpl
    查看类型列表。
    getComponentOfType()
    有缺陷,因为它只检查第一个参数和UB是否有空列表。
    bool check_singleton(Component*c)
    和“
    check_singleton
    使用字符串列表”似乎有矛盾。@Jarod42 1。对于
    getComponentOfType
    ,是的,我没有通过else,返回的
    nullptr
    应该在
    For
    循环之外。@Jarod42任何组件都可以是单态的,也可以不是单态的,当组件是单态的(即其类型)时。它在一个特殊容器中有一个条目
    std::list
    。此容器包含所有必须是单体的组件。而
    check_singleton
    会将给定组件与基于singleton_容器的组件容器进行比较。模板在编译期间进行评估。std::字符串只能在运行时编译时读取。您可以查看
    boost::mpl
    查看类型列表。
    getComponentOfType()
    有缺陷,因为它只检查第一个参数和UB是否有空列表。
    bool check_singleton(Component*c)
    和“
    check_singleton
    使用字符串列表”似乎有矛盾。@Jarod42 1。对于
    getComponentOfType
    ,是的,我没有通过else,返回的
    nullptr
    应该在
    For
    循环之外。@Jarod42任何组件都可以是单态的,也可以不是单态的,当组件是单态的(即其类型)时。它在一个特殊容器中有一个条目
    std::list
    。此容器包含所有必须是单体的组件。而
    检查\u singleton
    会将给定组件与基于singleton\u容器的组件容器进行比较。
    template<typename T >
    T* getComponent(){
        for( Component* c : container ){
            if( boost::typeindex::type_id_runtime(*c).pretty_name() == boost::typeindex::type_id_with_cvr<T>().pretty_name() ){
                return c;
            }
        }
        return nullptr;
    }
    
    template< typename T >
    T* getComponentOfType(){
       for( Component* c : container ){
          T* c2 = dynamic_cast<T*>(c);
          if( c2 != nullptr ){
             return c2;
          }
       }
       return nullptr;
    }