社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 5149阅读
  • 3回复

[C/C++]一个简易的类型判别器

发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
                                一个简易的类型判别器 _JGs}aQ  
             +1{fzb>9_  
                        在某些时候,我们需要判别一个对象的类型,C++提供了RTTI(运行时类型信息)机制,比如使用 typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。 ?~ULIO'  
9$d.P6|d>  
下面是一个简单的类型判别器(不能用于基本类型,如int、double等): >`V}U*}*H  
代码: 全选/* e`U Qz$4!  
* File: TypeUtils.h 9\O(n>  
* Author: kwarph [ kwarph@gmail.com ] ,8K'F  
* Time: 2009-3-21 下午03:25:02 3" Vd==oK~  
* e(\I_  
* Copyright (C) 2008-2009, kwarph, All Rights Reserved. 'Am-vhpm  
*/ rjojG59U>  
V+B71\x<  
#ifndef TYPEUTILS_H_ "HQF.#\#  
#define TYPEUTILS_H_ CyM}Hc&w  
s_wUM)!  
template<typename T> J?712=9  
struct InstanceOf { 2P~)I)3V  
A! 6r/   
    template<typename T1> )3E,D~1e%  
    static bool test(const T1*& ptr) { cwtD@KC[B  
        const T* t = dynamic_cast<const T*> (ptr); g@nk.aRw  
        return t != 0; ['Z{@9  
    } Sgj/s~j~1  
)r!e2zc=Q  
    template<typename T1> V 7<eQ0;m  
    static bool test(T1*& ptr) { Px4/O~bLk  
        T* t = dynamic_cast<T*> (ptr);  mIc:2.q^  
        return t != 0; z-u?s`k**  
    } v|+5:jFOqb  
F&@|M(  
    template<typename T1> ]A:( L9  
    static const T* get(const T1*& ptr) { K84&sSi  
        const T* t = dynamic_cast<const T*> (ptr); m/${8  
        return t; y$oW!  
    } i2F(GH?p[  
aw$Y`6,S  
    template<typename T1> 2cnj@E:5l  
    static T*& get(T1*& ptr) { |4SW[>WT:  
        return dynamic_cast<T*> (ptr); VuWib+fT  
    } fGu!M9qN4  
}; f$D@*33ft  
e@ oWwhpE  
#endif /* TYPEUTILS_H_ */             PW[6/7  
<f%/px%1  
Q  Q: 570508473 \|+/0 USn  
邮  件:athzhang@gmail.com >[3X]n,0  
电  话:(0512) 55253348,(0) 18912671348 xh'^c^1  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 #( uj$[o  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2009-08-04
Re: 一个简易的类型判别器 x;U|3{I o  
V*qY"[   
{8m1dEC^@Q  
下面作一个简单的测试,假设有一组对象,其继承关系如下: _Y#Bm/*  
1P5LH 5  
animal.png !J# .!}3  
    animal.png (8.28 KiB) 被浏览 187 次 /2w@ K_Px6  
qX@9N=g`#O  
~gt3Omh  
+qE']yzm!  
我们可以这么使用 InstanceOf类: Bcaw~WD  
bF6gBM@*  
代码: 全选 plku-O;]  
    Animal* a1 = new Lion; dQ6GhS ~  
    Animal* a2 = new Swallow; uC[d%v`  
WZ"W]Jyy{  
    // 1,判断 a1 是不是鸟类: on5 0+)uN  
    bool isBird = InstanceOf<Bird*>::test(a1); // isBird为false,a1是狮子 J#@lV  
zPBfiK_hV  
    // 2,判断 a1 是不是狮子: Xiju"Cup"  
    bool isLion = InstanceOf<Lion*>::test(a1); gb_X?j%p7  
ADBpX>  
    // 3,判断 a2 是不是鸟类: 41 'EA \V  
    isBird = InstanceOf<Bird*>::test(a1); // isBird为true,a2 是燕子,所以是鸟类 ,9vJtP+T+!  
)*HjRTF6G  
3ZN>9`  
hho%~^bn(  
在 3,判断 a2 是不是鸟类 的判断中,typeid无法达到我们所要的效果,因为: jZ#UUnR%  
(6-y+ LG  
代码: 全选 Lh!z>IWjOG  
    isBird = (typeid(*a2) == typeid(Bird)); // isBird 为 false ,aO@.<"  
y< ud('D  
@LC~*_y   
uQ1jwYK`7  
typeid()返回的是对象实际的类型,也就是说Swallow虽然是Bird,但这是两个不同的类型。 /s8/q2:  
"G kI5!  
Q  Q: 570508473  NDW8~lkL  
邮  件:]athzhang@gmail.com Lupy:4AD  
电  话:(0512) 55253348,(0) 18912671348 :B^mV{~  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 )
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 2 发表于: 2009-08-04
Re: 一个简易的类型判别器 #{~7G%GPY5  
khS/'b  
/x O{ .dr  
其实很多场合用得上的,比如我们目前进行的CAD项目,在前台的界面的绘图区中选取一批对象,其中也许有Line、Conic、BezierCurve、 BSplineCurve等,但都属于Curve,我们可以对它们的共有特性进行统一修改(比如在对话框1中列举公共的特性,即Curve的属性),但如果我们选择的是一条直线,那么我们必须确定这个被选择的对象就是Line,弹出合适的对话框(罗列Line对象的可修改的属性),这个时候,我们可以用上面的InstanceOf。 LV\ieM  
We\Y \*!v  
当然,好的设计总能减少对类型确认的需要,但我想应该不能完全避免吧。 A?' H[2]w"  
&/DOO ^  
昆山轩辕高端IT培训中心 jQs*(=ls  
Q  Q: 570508473 1W0.Ufl)  
邮  件:athzhang@gmail.com Yg|"-  
电  话:(0512) 55253348,(0) 18912671348 BDp:9yau  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 3 发表于: 2009-08-05
Q  Q: 570508473 A{1 \f*  
主页:http://www.xuanyuan-soft.cn k!9=  
论坛:http://www.xuanyuan-soft.cn/forums
描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五