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

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

发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
                                一个简易的类型判别器 5c@,bIl *  
             h/QXPdV  
                        在某些时候,我们需要判别一个对象的类型,C++提供了RTTI(运行时类型信息)机制,比如使用 typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。 qJf?o.Pv  
po c`q5i+  
下面是一个简单的类型判别器(不能用于基本类型,如int、double等): -mbt4w  
代码: 全选/* w1F cB$  
* File: TypeUtils.h +r�  
* Author: kwarph [ kwarph@gmail.com ] u4*BX&  
* Time: 2009-3-21 下午03:25:02 U45e2~1!O  
* Yj<a" Gr4[  
* Copyright (C) 2008-2009, kwarph, All Rights Reserved. k90YV(  
*/ iOf<$f  
vO H4#  
#ifndef TYPEUTILS_H_ XnH05LQ  
#define TYPEUTILS_H_ 3p$?,0ELH  
i7CX65&b  
template<typename T> u%GEqruo[  
struct InstanceOf { %HhBt5w  
,5P0S0*{  
    template<typename T1> +N]J5Ve-`t  
    static bool test(const T1*& ptr) { +WZX.D  
        const T* t = dynamic_cast<const T*> (ptr); k`cfG\;r  
        return t != 0; ^L,K& Jd  
    } =bAx,,D#  
+X\FBvP&  
    template<typename T1> c^5~QGuQ  
    static bool test(T1*& ptr) { vJLK,[  
        T* t = dynamic_cast<T*> (ptr); DcS+_>a\{l  
        return t != 0; {Ea b j  
    } x f'V{9*  
5p,RI&nlN  
    template<typename T1> W Tcw4  
    static const T* get(const T1*& ptr) { ;_XFo&@  
        const T* t = dynamic_cast<const T*> (ptr); K,tQ!kk  
        return t; PioZIb/{  
    } %6t:(z  
av(6wht8  
    template<typename T1> 3RUy, s  
    static T*& get(T1*& ptr) { e_^26^{q  
        return dynamic_cast<T*> (ptr); 7kC^ 30@T3  
    } +Z,;,5'5G  
}; Hkg2P ,2  
#QZe,"C9`  
#endif /* TYPEUTILS_H_ */             m%0p\Y-/  
9v#CE!  
Q  Q: 570508473 7:e{;iG  
邮  件:athzhang@gmail.com b8H{8{wi|  
电  话:(0512) 55253348,(0) 18912671348 YByLoM*  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 Q1lyj7c#x  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2009-08-04
Re: 一个简易的类型判别器 SA:Zc^aV  
_OYasJUMG  
l#&8x  
下面作一个简单的测试,假设有一组对象,其继承关系如下: j<upRS,$  
v6|RJt?  
animal.png g%o(+d  
    animal.png (8.28 KiB) 被浏览 187 次 OU E (I3_  
REQ\>UO_  
x exaQuK  
)',R[|<  
我们可以这么使用 InstanceOf类: {.`vs;U  
$Ph|e)p  
代码: 全选 2 'l'8  
    Animal* a1 = new Lion; pR<`H'  
    Animal* a2 = new Swallow; SV4E0c>  
$+Z[K.2J  
    // 1,判断 a1 是不是鸟类: WpDSg*fk=Y  
    bool isBird = InstanceOf<Bird*>::test(a1); // isBird为false,a1是狮子 aNsBcov3O  
7lTC{7C57  
    // 2,判断 a1 是不是狮子: gE-tjoJ  
    bool isLion = InstanceOf<Lion*>::test(a1); eNh39er  
EZgwF =lO  
    // 3,判断 a2 是不是鸟类: t6rRU~;}  
    isBird = InstanceOf<Bird*>::test(a1); // isBird为true,a2 是燕子,所以是鸟类 KA5v+~  
_r#Z}HK  
qyb?49I  
'(6z. toQ  
在 3,判断 a2 是不是鸟类 的判断中,typeid无法达到我们所要的效果,因为: %64 )(z  
`K"L /I9  
代码: 全选 v4<nI;Ux  
    isBird = (typeid(*a2) == typeid(Bird)); // isBird 为 false \Dm";Ay>  
3l]lwV  
'B$yo]  
SZ7:u895E  
typeid()返回的是对象实际的类型,也就是说Swallow虽然是Bird,但这是两个不同的类型。 J[&@PUy  
5"VTK  
Q  Q: 570508473  7jrt7[{  
邮  件:]athzhang@gmail.com t mn tp  
电  话:(0512) 55253348,(0) 18912671348 ';k5?^T  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 )
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 2 发表于: 2009-08-04
Re: 一个简易的类型判别器 UsG~row:!  
TvoyZW\?w  
DDQx g  
其实很多场合用得上的,比如我们目前进行的CAD项目,在前台的界面的绘图区中选取一批对象,其中也许有Line、Conic、BezierCurve、 BSplineCurve等,但都属于Curve,我们可以对它们的共有特性进行统一修改(比如在对话框1中列举公共的特性,即Curve的属性),但如果我们选择的是一条直线,那么我们必须确定这个被选择的对象就是Line,弹出合适的对话框(罗列Line对象的可修改的属性),这个时候,我们可以用上面的InstanceOf。 E, Z$pKL?  
5PCqYN(:B  
当然,好的设计总能减少对类型确认的需要,但我想应该不能完全避免吧。 `?H]h"{7Q  
L<c4kw  
昆山轩辕高端IT培训中心 t|?ez4/{z  
Q  Q: 570508473 j a[Et/r  
邮  件:athzhang@gmail.com yZ7&b&2nLn  
电  话:(0512) 55253348,(0) 18912671348 AOZP*\k  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 3 发表于: 2009-08-05
Q  Q: 570508473 7O2/z:$f  
主页:http://www.xuanyuan-soft.cn /V8 #[9K  
论坛:http://www.xuanyuan-soft.cn/forums
描述
快速回复

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