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

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

发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
                                一个简易的类型判别器 SC2g5i`  
             !A_KCM:Ym  
                        在某些时候,我们需要判别一个对象的类型,C++提供了RTTI(运行时类型信息)机制,比如使用 typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。 |:SXN4';?  
i'#%t/ u  
下面是一个简单的类型判别器(不能用于基本类型,如int、double等): 8mX:*$qm:  
代码: 全选/* Io_7  
* File: TypeUtils.h Z \ -  
* Author: kwarph [ kwarph@gmail.com ] _ g"su #  
* Time: 2009-3-21 下午03:25:02 b|`  
* uQWd`7  
* Copyright (C) 2008-2009, kwarph, All Rights Reserved. .+^o{b  
*/ ]d&;QZ#w  
3v<9 Z9O  
#ifndef TYPEUTILS_H_ _'s5FlZq  
#define TYPEUTILS_H_ \z2d=E  
dBW#PRg  
template<typename T> ['0^gN$:e  
struct InstanceOf { IRI<no  
c;R .rV<  
    template<typename T1> 'zTa]y]a  
    static bool test(const T1*& ptr) { 5d82Ms  
        const T* t = dynamic_cast<const T*> (ptr); f<3r;F7  
        return t != 0; #DH eEE  
    } niM(0p  
H Sk}09GV  
    template<typename T1> .ZH5^Sv$vp  
    static bool test(T1*& ptr) { :.\h.H;  
        T* t = dynamic_cast<T*> (ptr); XpOQBXbt  
        return t != 0; TUVqQ\oF:  
    } s-xby~  
9}Zi_xK&|e  
    template<typename T1> E}=F   
    static const T* get(const T1*& ptr) { kc:2ID&  
        const T* t = dynamic_cast<const T*> (ptr); &oiBMk`*  
        return t; z[_Gg8e  
    } YA^g[,  
,[Z;"wE  
    template<typename T1> knZ<V%/e  
    static T*& get(T1*& ptr) { 1uhSP!b  
        return dynamic_cast<T*> (ptr); i'vjvc~  
    } Q|cA8Fn  
}; Ad`jV_z  
 \R<OT%8  
#endif /* TYPEUTILS_H_ */             8f|+045E@  
MT@Uu  
Q  Q: 570508473 SkA"MhX  
邮  件:athzhang@gmail.com 93#wU})  
电  话:(0512) 55253348,(0) 18912671348 =t-503e.J  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 ::kpAE]  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2009-08-04
Re: 一个简易的类型判别器 S b3@7^  
U z6XQskX  
_u`W$EG L  
下面作一个简单的测试,假设有一组对象,其继承关系如下: tMy@'nj  
J&6]3x  
animal.png yf6&'Y{  
    animal.png (8.28 KiB) 被浏览 187 次 \(bML#I  
W1J7$   
V|fs"HY  
ouUU(jj02  
我们可以这么使用 InstanceOf类: \6${Na' \  
{%b-~& F9  
代码: 全选 NASRr  
    Animal* a1 = new Lion; JEes'H}Y  
    Animal* a2 = new Swallow; z '%Vy  
];go?.*C  
    // 1,判断 a1 是不是鸟类: XX(;,[(_  
    bool isBird = InstanceOf<Bird*>::test(a1); // isBird为false,a1是狮子 ?wx|n_3<:  
bdCpGG9  
    // 2,判断 a1 是不是狮子: etH%E aF[  
    bool isLion = InstanceOf<Lion*>::test(a1); dGzZ_Vf  
Oj0/[(D-  
    // 3,判断 a2 是不是鸟类: z7J2O  
    isBird = InstanceOf<Bird*>::test(a1); // isBird为true,a2 是燕子,所以是鸟类 Kq';[Yc  
s0"1W"7vh  
!(Y23w*  
f"5vpU^5*  
在 3,判断 a2 是不是鸟类 的判断中,typeid无法达到我们所要的效果,因为: [nlW}1)46  
QY<2i-A  
代码: 全选 `D%bZ%25c  
    isBird = (typeid(*a2) == typeid(Bird)); // isBird 为 false lU.@! rGbw  
6^.<5SJ}  
Hd)4_ uBt  
dLm~]V3  
typeid()返回的是对象实际的类型,也就是说Swallow虽然是Bird,但这是两个不同的类型。 =6TD3k6(2  
L%JmdY;  
Q  Q: 570508473  ( Qw"^lE3  
邮  件:]athzhang@gmail.com dg1h<]T"9  
电  话:(0512) 55253348,(0) 18912671348 ;HJ|)PN5L  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 )
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 2 发表于: 2009-08-04
Re: 一个简易的类型判别器 nrMm](Y45  
2, ` =i  
[L,Tf_t^Y  
其实很多场合用得上的,比如我们目前进行的CAD项目,在前台的界面的绘图区中选取一批对象,其中也许有Line、Conic、BezierCurve、 BSplineCurve等,但都属于Curve,我们可以对它们的共有特性进行统一修改(比如在对话框1中列举公共的特性,即Curve的属性),但如果我们选择的是一条直线,那么我们必须确定这个被选择的对象就是Line,弹出合适的对话框(罗列Line对象的可修改的属性),这个时候,我们可以用上面的InstanceOf。 ,r{\aW@  
u%S&EuX  
当然,好的设计总能减少对类型确认的需要,但我想应该不能完全避免吧。 yla&/K;|*  
F%x8y  
昆山轩辕高端IT培训中心 </|IgN$w`  
Q  Q: 570508473 *O|Z[>  
邮  件:athzhang@gmail.com Llk4 =p  
电  话:(0512) 55253348,(0) 18912671348 T'l >$6  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 3 发表于: 2009-08-05
Q  Q: 570508473 },'2j  
主页:http://www.xuanyuan-soft.cn R$=UJ}>  
论坛:http://www.xuanyuan-soft.cn/forums
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八