一个简易的类型判别器 ~g;)8X;;+ l8e)|MSh 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
T# gx2Y =)a%,H 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
&>G8DvfJ9 代码: 全选/*
*w/N>:V0p * File: TypeUtils.h
+-|}<mq * Author: kwarph [
kwarph@gmail.com ]
s+E4AG1r * Time: 2009-3-21 下午03:25:02
8~g~XUl *
5Fbb5`( * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
4JXJ0T ar */
X1BqN+=@9 mP?}h #ifndef TYPEUTILS_H_
?a'EkZ.dB #define TYPEUTILS_H_
$x#qv1 7p>T6jK) template<typename T>
U/xzl4m6 struct InstanceOf {
x'SIHV4M@Q I.`DBI#-f template<typename T1>
`'gcF}); static bool test(const T1*& ptr) {
fuWAw^& const T* t = dynamic_cast<const T*> (ptr);
'pF$6n; return t != 0;
:^FH.6}x }
nP|ah~
q 77j"zr7v
template<typename T1>
T7l,}G static bool test(T1*& ptr) {
o@C|*TXN T* t = dynamic_cast<T*> (ptr);
5glEV`.je return t != 0;
i+lq:St }
@gQ?cU 7 >t.PU.OM template<typename T1>
k?/! ` static const T* get(const T1*& ptr) {
=FdFLrx~l const T* t = dynamic_cast<const T*> (ptr);
`>RM:!m6=$ return t;
SzFh }
JV+Uy$P! %CgmZTz~< template<typename T1>
579t^"ja~ static T*& get(T1*& ptr) {
>y!O_@>z return dynamic_cast<T*> (ptr);
G=C2l#
Ae! }
4#I=n~8a };
B%o%%A8*g D%=&euB #endif /* TYPEUTILS_H_ */
A>(EM}\, 9<"F3F0| Q Q: 570508473
)0Vj\> 邮 件:
athzhang@gmail.com {7v|\6@e3 电 话:(0512) 55253348,(0) 18912671348
tA9Ew{3s 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
VP7LKfv