Boost-让C++更加优雅!

在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的事情,放着这么多好东西不用,在一遍一遍地发明着重复却又笨拙的轮子。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值