dsa*_*laj 1 c++ std typeid c++11
我想以同样的方式处理特定类的所有孩子.
到目前为止,我一直在检查dynamic_cast
这样:
if(dynamic_cast<ParentClass*>(child_object))
{
// handle the object
}
Run Code Online (Sandbox Code Playgroud)
在我不需要强制使用子对象的情况下,有没有更好的方法呢?
我的第一次尝试是:
if(std::is_base_of<ParentClass, typeid(child_object)>::value)
Run Code Online (Sandbox Code Playgroud)
这当然不能作为is_base_of
期望的两个class
参数和typeid()
返回std::type_info
.
所以我的问题是,这样做的正确方法是什么?或者dynamic_cast
即使没有使用铸造的物体,它也是正确的设施吗?
这是我想要实现的具体例子.我正在迭代QGraphicsItem
与我感兴趣的对象发生碰撞的所有对象.我只想处理这些对象中的一组而忽略其余的对象.那组对象有一个共同的父对象.那么再次使用的dynamic_cast
方式,还是有更好的选择?
for(QGraphicsItem* i : collidingItems())
{
if(dynamic_cast<ParentClass*>(i))
{
// handle specific group of objects that
//are children of ParentClass
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
dynamic_cast
是要走的路.它是检测对象是否是某个类的继承树的一部分的唯一方法,因为它typeid
只会为您提供该类的实际名称.
话虽这么说,如果需要对给定类的对象进行特定的操作,它应该是一个虚方法.使用RTTI通常是不好的形式,但特别是在这里.
归档时间: |
|
查看次数: |
678 次 |
最近记录: |