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;
}