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

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

发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
                                一个简易的类型判别器 ?,Xw[pR  
             b6M[q_   
                        在某些时候,我们需要判别一个对象的类型,C++提供了RTTI(运行时类型信息)机制,比如使用 typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。 B IEO,W|  
HWAdhDZ  
下面是一个简单的类型判别器(不能用于基本类型,如int、double等): m@j?za9s  
代码: 全选/* M^Yh|%M  
* File: TypeUtils.h ja'T+!k  
* Author: kwarph [ kwarph@gmail.com ] ,,.QfUj/&  
* Time: 2009-3-21 下午03:25:02 6- YU[HF  
* ZoqZap6e  
* Copyright (C) 2008-2009, kwarph, All Rights Reserved. P[-E@0h)-t  
*/ {W`%g^Z|H  
_ye |Y  
#ifndef TYPEUTILS_H_ /N+dQe  
#define TYPEUTILS_H_ @7c?xQVd$  
mIvx1_[  
template<typename T> "{+QW  
struct InstanceOf { #MkTkm&r  
N% B>M7-=  
    template<typename T1> wu6;.xTLl  
    static bool test(const T1*& ptr) { Paq4  
        const T* t = dynamic_cast<const T*> (ptr); 2qNt,;DQ  
        return t != 0; $Wol?)z  
    } MY)O^I X$  
r6Dz;uz  
    template<typename T1> rKc9b<Ir  
    static bool test(T1*& ptr) { s^TZXCyF o  
        T* t = dynamic_cast<T*> (ptr); Wi<m{.%\E  
        return t != 0; =s{>Fsm1  
    } *Q.>-J<S  
l'1pw  
    template<typename T1> ~/U 1xk%  
    static const T* get(const T1*& ptr) { [aLI '  
        const T* t = dynamic_cast<const T*> (ptr); @bLy,Xr&  
        return t; }#+^{P3;  
    } }&D WaO]J7  
{WS;dX4  
    template<typename T1> 0> E r=,e  
    static T*& get(T1*& ptr) { rXq.DvQ  
        return dynamic_cast<T*> (ptr); c#]4awHU  
    } 3`?7 <YJ  
}; T<>,lQs(a  
.43'HV  
#endif /* TYPEUTILS_H_ */             Y-z(zS^1  
\l0[rcEf  
Q  Q: 570508473 =%O6:YM   
邮  件:athzhang@gmail.com {fM'6;ak  
电  话:(0512) 55253348,(0) 18912671348 ~=LE0.3[  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 W i.& e  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2009-08-04
Re: 一个简易的类型判别器 Q{>k1$fkV  
{S \{Ii6  
?$pCsBDo  
下面作一个简单的测试,假设有一组对象,其继承关系如下: y Pp9\[+^j  
cVpp-Z|s8  
animal.png IPpN@  
    animal.png (8.28 KiB) 被浏览 187 次 y.k~Y0  
8Fh)eha9f  
U/M>?G~  
q?:dCFw$x5  
我们可以这么使用 InstanceOf类: &-w Cvp7  
|e&\<LwsP  
代码: 全选 3}1u\(Mf  
    Animal* a1 = new Lion; pki%vRY  
    Animal* a2 = new Swallow; r5/0u(\LB  
:-Z2:/P  
    // 1,判断 a1 是不是鸟类: hfTY.  
    bool isBird = InstanceOf<Bird*>::test(a1); // isBird为false,a1是狮子 6MW{,N  
,`Z1m o>n  
    // 2,判断 a1 是不是狮子: gH vZVC[b  
    bool isLion = InstanceOf<Lion*>::test(a1); ]EAO+x9  
l'qg8  
    // 3,判断 a2 是不是鸟类: D_7,m%Z:  
    isBird = InstanceOf<Bird*>::test(a1); // isBird为true,a2 是燕子,所以是鸟类 T-L||yE,h  
vr l-$ii  
X?',n 1  
}.(B}/$u  
在 3,判断 a2 是不是鸟类 的判断中,typeid无法达到我们所要的效果,因为: bJ%h53  
3"e,q Y  
代码: 全选 #{6/ (X  
    isBird = (typeid(*a2) == typeid(Bird)); // isBird 为 false xo&_bMO  
^ @5QP$.  
BxmWIItz  
*&W"bOMH*  
typeid()返回的是对象实际的类型,也就是说Swallow虽然是Bird,但这是两个不同的类型。 `w Vyb>T  
&z3o7rif$  
Q  Q: 570508473  J@'wf8Ub  
邮  件:]athzhang@gmail.com "S]TP$O D  
电  话:(0512) 55253348,(0) 18912671348 jr. "I+  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 )
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 2 发表于: 2009-08-04
Re: 一个简易的类型判别器 CCx&7f  
CTa57R  
q} >%8;nm  
其实很多场合用得上的,比如我们目前进行的CAD项目,在前台的界面的绘图区中选取一批对象,其中也许有Line、Conic、BezierCurve、 BSplineCurve等,但都属于Curve,我们可以对它们的共有特性进行统一修改(比如在对话框1中列举公共的特性,即Curve的属性),但如果我们选择的是一条直线,那么我们必须确定这个被选择的对象就是Line,弹出合适的对话框(罗列Line对象的可修改的属性),这个时候,我们可以用上面的InstanceOf。 F41=b4/  
3 0H?KAV  
当然,好的设计总能减少对类型确认的需要,但我想应该不能完全避免吧。 ,"ZMRq  
?a5!H*,  
昆山轩辕高端IT培训中心 T5h H  
Q  Q: 570508473 4[e X e$  
邮  件:athzhang@gmail.com cwg"c4V  
电  话:(0512) 55253348,(0) 18912671348 z:*|a+cy  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 3 发表于: 2009-08-05
Q  Q: 570508473 e"<OELA  
主页:http://www.xuanyuan-soft.cn ,J@  
论坛:http://www.xuanyuan-soft.cn/forums
描述
快速回复

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