当我尝试检查某个对象是否是另一个对象的子类时,我遇到了一个小问题。我知道is_base_of
,is_same
方法,但它们无法满足我的需求。事情就是这样:
我有一个多态对象列表(Component)std::list<Component*>
,以及一系列作用于这些容器的模板方法。
getComponent<T>(), getComponents<T>(), getComponentOfType<T>() ...
T* getComponent():
从容器中检索T类型的任何组件(如果存在)。否则,返回nullptr
。它处理对象和类型
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;
}
T* getComponentOfType()
从容器中检索类型或__sub类型T
的任何组件(如果存在)。否则,返回nullptr
。它处理对象和类型
T
template< typename T >
T* getComponentOfType(){
for( Component* c : container ){
T* c2 = dynamic_cast<T*>(c);
if( c2 != nullptr ){
return c2;
}
}
return nullptr;
}
std::list<T*> getComponents():
和std::list<T*> getComponentsOfType()
分别是getComponent()
和getComponentOfType()
的列表版本。但,其余方法需要处理对象和对象,或对象和串
例如,一个名为bool check_singleton(Component* c)
的方法,检查容器是否包含c
的类型或子类型的组件,
请注意: c is polymorphic
和check_singleton
使用字符串列表,其中包含必须为单例的所有组件。 std::list<std::string>
可以表示如下:
object inherits "ClassName"
??
谢谢。 亲切。