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

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

发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
                                一个简易的类型判别器 2u~0B +)K/  
             9L*gxI>  
                        在某些时候,我们需要判别一个对象的类型,C++提供了RTTI(运行时类型信息)机制,比如使用 typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。 5MO:hE5sm  
BAx)R6kS;  
下面是一个简单的类型判别器(不能用于基本类型,如int、double等): JOx75}  
代码: 全选/* ^Qs-@]E-  
* File: TypeUtils.h s"=e (ob  
* Author: kwarph [ kwarph@gmail.com ] \b1I<4(  
* Time: 2009-3-21 下午03:25:02 ;yx+BaG~?  
* cJGA5m/{I  
* Copyright (C) 2008-2009, kwarph, All Rights Reserved. -~p@o1k0  
*/ (TDLT^  
8n,i5>!d  
#ifndef TYPEUTILS_H_ Z"mpE+U*  
#define TYPEUTILS_H_ h,\^Sb5AP  
 7=6p  
template<typename T> VQ$=F8ivG  
struct InstanceOf { I,l%6oPa  
\4bma<~a  
    template<typename T1> iS hB ^  
    static bool test(const T1*& ptr) { 0/#XUX 4  
        const T* t = dynamic_cast<const T*> (ptr); 6jO*rseC  
        return t != 0; d&n0:xOc  
    } eWhv X9 <  
{Ejv8UdA9  
    template<typename T1> Z8}Zhe.  
    static bool test(T1*& ptr) { Cc1sZWvz  
        T* t = dynamic_cast<T*> (ptr); P zzX Ds6  
        return t != 0; 49@ pA-  
    } N?p9h{DG  
_r+9S.z  
    template<typename T1> Qo0okir  
    static const T* get(const T1*& ptr) { G$x uHHZ'  
        const T* t = dynamic_cast<const T*> (ptr);  i('z~  
        return t; }^pnwo9vV  
    } _( 0!bUs>  
O (tcu@vfl  
    template<typename T1> BO#fzq%  
    static T*& get(T1*& ptr) { fp:j~a>E  
        return dynamic_cast<T*> (ptr); MV e5j+8  
    } IhJ _Yed  
}; C' o4Su#  
3Nsb@0  
#endif /* TYPEUTILS_H_ */             @433?g`2b  
@j9yc  
Q  Q: 570508473 #OJsu  
邮  件:athzhang@gmail.com SdYES5aES  
电  话:(0512) 55253348,(0) 18912671348 b,#cc>76\  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 Vj:)w<] ,  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2009-08-04
Re: 一个简易的类型判别器 |2 g }i\  
]W5s!T_  
Y GO ;wIS  
下面作一个简单的测试,假设有一组对象,其继承关系如下: z,P:i$  
ZBJ.dK?Ky|  
animal.png [A yq%MA  
    animal.png (8.28 KiB) 被浏览 187 次 VS%8f.7ep  
>Djv8 0  
7>9/bB+TL  
$*G]6s  
我们可以这么使用 InstanceOf类: 4<ER dP7"-  
W a2V Z  
代码: 全选 &rq7;X  
    Animal* a1 = new Lion; r&o%n5B  
    Animal* a2 = new Swallow; *NFy%ktu  
Y xGIv8O]  
    // 1,判断 a1 是不是鸟类: ~N>[7I"*  
    bool isBird = InstanceOf<Bird*>::test(a1); // isBird为false,a1是狮子 3-h u'xSU  
G"O %u|7  
    // 2,判断 a1 是不是狮子: 2a (w7/W:  
    bool isLion = InstanceOf<Lion*>::test(a1); }]=b%CPJh+  
f|m.v +7k  
    // 3,判断 a2 是不是鸟类: Lyt6DvAp"  
    isBird = InstanceOf<Bird*>::test(a1); // isBird为true,a2 是燕子,所以是鸟类 XFG]%y=/6  
\%mR*J+  
8W[QV  
:1hp_XfJb  
在 3,判断 a2 是不是鸟类 的判断中,typeid无法达到我们所要的效果,因为: O)\xElu  
[LjYLm%<  
代码: 全选 zOg#=ql  
    isBird = (typeid(*a2) == typeid(Bird)); // isBird 为 false M\enjB7k  
ky#<\K1}'  
3543[W#a  
{pd%I  
typeid()返回的是对象实际的类型,也就是说Swallow虽然是Bird,但这是两个不同的类型。 pZlBpGQf  
%vxd($Ti"  
Q  Q: 570508473  zc*qmb  
邮  件:]athzhang@gmail.com P]yER9'  
电  话:(0512) 55253348,(0) 18912671348 a_x$I? ,  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼 )
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 2 发表于: 2009-08-04
Re: 一个简易的类型判别器 ;Zw!  
&EE6<-B-  
8ENAif   
其实很多场合用得上的,比如我们目前进行的CAD项目,在前台的界面的绘图区中选取一批对象,其中也许有Line、Conic、BezierCurve、 BSplineCurve等,但都属于Curve,我们可以对它们的共有特性进行统一修改(比如在对话框1中列举公共的特性,即Curve的属性),但如果我们选择的是一条直线,那么我们必须确定这个被选择的对象就是Line,弹出合适的对话框(罗列Line对象的可修改的属性),这个时候,我们可以用上面的InstanceOf。 X xB*lX  
xDRK^nmC  
当然,好的设计总能减少对类型确认的需要,但我想应该不能完全避免吧。 j 9y,UT  
E+ JGqk  
昆山轩辕高端IT培训中心 Y0&w;P  
Q  Q: 570508473 AJC Wp4,  
邮  件:athzhang@gmail.com X H{5E4P  
电  话:(0512) 55253348,(0) 18912671348 ,y:q]PR  
地  址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
发帖
7
铜板
13
人品值
61
贡献值
2
交易币
0
好评度
7
信誉值
0
金币
0
所在楼道
只看该作者 3 发表于: 2009-08-05
Q  Q: 570508473 Y49kq}  
主页:http://www.xuanyuan-soft.cn S4~^HvMG[Y  
论坛:http://www.xuanyuan-soft.cn/forums
描述
快速回复

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