检查对象是T的类型还是子类型,T存储为String

时间:2016-09-01 07:48:01

标签: c++ templates inheritance dynamic-cast

当我尝试检查某个对象是否是另一个对象的子类时,我遇到了一个小问题。我知道is_base_ofis_same方法,但它们无法满足我的需求。事情就是这样:

我有一个多态对象列表(Component)std::list<Component*>,以及一系列作用于这些容器的模板方法。 getComponent<T>(), getComponents<T>(), getComponentOfType<T>() ...

  1. T* getComponent():从容器中检索T类型的任何组件(如果存在)。否则,返回nullptr
  2.   

    它处理对象和类型 T :我使用 boost :: typeindex :: type_index

    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;
    }
    
    1. T* getComponentOfType()从容器中检索类型或__sub类型T的任何组件(如果存在)。否则,返回nullptr
    2.   

      它处理对象和类型 T

      template< typename T >
      T* getComponentOfType(){
         for( Component* c : container ){
            T* c2 = dynamic_cast<T*>(c);
            if( c2 != nullptr ){
               return c2;
            }
         }
         return nullptr;
      }
      
      1. std::list<T*> getComponents():std::list<T*> getComponentsOfType()分别是getComponent()getComponentOfType()的列表版本。
      2. ,其余方法需要处理对象对象,或对象

        例如,一个名为bool check_singleton(Component* c)的方法,检查容器是否包含c的类型或子类型的组件,

        请注意: c is polymorphiccheck_singleton使用字符串列表,其中包含必须为单例的所有组件。 std::list<std::string>

        可以表示如下:

          

        object inherits "ClassName" ??

        谢谢。 亲切。

0 个答案:

没有答案