一个简易的类型判别器 E\ 'X|/$a 4t Z. T9d 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
[>pqf Y64B"J=P9 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
L.]mC ! 代码: 全选/*
x>E**a?!L * File: TypeUtils.h
dE[_]2];P * Author: kwarph [
kwarph@gmail.com ]
9Ytd E*,k * Time: 2009-3-21 下午03:25:02
jNO8n)a&p *
`6t3D&.u0 * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
p| #gn<z} */
IdvBQ [Gj 6BPZ2EQ #ifndef TYPEUTILS_H_
REmD*gf #define TYPEUTILS_H_
lQ}e"#< 0lvX,78G ; template<typename T>
ilyQgEjC struct InstanceOf {
A{7N#-h_ o4Bl!7U template<typename T1>
i N}BMd.U static bool test(const T1*& ptr) {
9hG+? const T* t = dynamic_cast<const T*> (ptr);
R+s_uwS return t != 0;
r7I,%}k }
Gn
]%'lrg' !Qg%d&q.Sx template<typename T1>
>v+ia%o static bool test(T1*& ptr) {
9t$%Tc#Z T* t = dynamic_cast<T*> (ptr);
.%@=,+nqz return t != 0;
>Kd(.r[Er }
Kk^tQwj/QE >:ZlYZ6sI template<typename T1>
B) 81mcy static const T* get(const T1*& ptr) {
0shNwV1zF const T* t = dynamic_cast<const T*> (ptr);
FC= %_y return t;
Wu
71q= }
VH{SE7 }}GBCXAf_ template<typename T1>
]Mh7;&<6[ static T*& get(T1*& ptr) {
[xXml On! return dynamic_cast<T*> (ptr);
@UO=)PxN3 }
vWJhSpC[ };
GXEOgf#i #"M 'Cs #endif /* TYPEUTILS_H_ */
Q7y6</4f RRD\V3C84 Q Q: 570508473
7eh|5e$@ 邮 件:
athzhang@gmail.com `9QrkkG+ 电 话:(0512) 55253348,(0) 18912671348
/HNZwbh]uJ 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
5JbPB!5;