在C++中,RTTI可以让我们在运行时获得一个对象的类型信息。
通过typeid操作符,我们可以得到一个type_info对象,调用其成员函数name(),可以得到类型的名字(字符串)。
但是,如果给定两个对象,该如何判断他们之间是否存在继承关系?是否是同一种类型?或者,要复制一个该类型的对象?这里需要用到Boost。
先说说需要用到的头文件和命名空间:
#include <memory>
#include <vector>
#include <boost/any.hpp>
#include <boost/type_traits.hpp>
#include <boost/typeof/typeof.hpp>
using namespace std;
using namespace boost;
假如我们有以下两个类
class Object
{
};
class ObjectEx : public Object
{
};
先定义两个对象
Object obj;
Object objEx;
首先要用到的是宏BOOST_TYPEOF(),它可以得到对象的类型,类似于Java中的getClass()方法。
如我们克隆一个obj类型的对象:BOOST_TYPEOF(obj) clone;
现在我们得到obj的类型信息了,该如何判断两个类的实例之间是否存在继承关系呢?
通过boost::is_base_of<Base, Derived>()! 代码如下:
if (boost::is_base_of<BOOST_TYPEOF(obj), BOOST_TYPEOF(objEx)>())
{
cout<<"存在继承关系"<<endl;
}
程序运行时将输出:存在继承关系
确实很方便!可是,指针呢?先试试智能指针
std::shared_ptr<Object> pObj(new Object);
std::shared_ptr<ObjectEx> pObjEx(new ObjectEx);
if (boost::is_base_of<BOOST_TYPEOF(pObj), BOOST_TYPEOF(pObjEx)>())
{
cout<<"存在继承关系"<<endl;
}
很遗憾,没有任何输出!再试试普通指针吧,或许...
Object* p1 = new Object;
ObjectEx* p2 = new ObjectEx;
if (boost::is_base_of<BOOST_TYPEOF(p1), BOOST_TYPEOF(p2)>())
{
cout<<"存在继承关系"<<endl;
}
还是没有任何输出。那么,引用呢?再试试
Object r1 = obj;
ObjectEx r2 =objEx;
if (boost::is_base_of<BOOST_TYPEOF(r1), BOOST_TYPEOF(r2)>())
{
cout<<"存在继承关系"<<endl;
}
这回,有输出了。
呵呵,结论已经很明白了!
至于,如何判断两个对象是否为同一类型,可以使用函数:boost::is_same<T, U>(),具体就不多说啦
关于类型特性的,还有很多函数,可以参考Boost文档中type_traits章节。
很惭愧,直到今年才开始使用boost库,之前连vector、智能指针都几乎没用过,猛然发觉,自己都一直拿着C++的编译器干着C的事情,放着这么多好东西不用,在一遍一遍地发明着重复却又笨拙的轮子。