一个简易的类型判别器 sXVl4!=l6 %QP[/5vQ 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
<':h/d <rC%$tr 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
G,C`+1$* 代码: 全选/*
5|*{~O| * File: TypeUtils.h
%
/:1eE`!S * Author: kwarph [
kwarph@gmail.com ]
-K|1w'E * Time: 2009-3-21 下午03:25:02
MQ,K%_m8 *
IQ&PPC * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
eV7;#w<] */
Vr2A7kq gP_N|LuF" #ifndef TYPEUTILS_H_
0ix(1`Z #define TYPEUTILS_H_
>u= tN#C.M7.'7 template<typename T>
C?qRZB+W# struct InstanceOf {
1UP
{j`-K| 6_mi9_w template<typename T1>
h<9vm[ . static bool test(const T1*& ptr) {
w/@ZPBRo] const T* t = dynamic_cast<const T*> (ptr);
n#!c!EfG return t != 0;
}s,NM%oI }
#]h
X."b2 APu$t$dmm template<typename T1>
Jg#0g
eU static bool test(T1*& ptr) {
i(~DhXz*T T* t = dynamic_cast<T*> (ptr);
BTAbDyH5 return t != 0;
h)Y] L#R }
~ QRjl t/|0"\ p template<typename T1>
gIo\^ktW static const T* get(const T1*& ptr) {
t/ \S9 const T* t = dynamic_cast<const T*> (ptr);
WI\a return t;
@i ~ A7L0/ }
+4yre^gC ~z^?+MgZ2 template<typename T1>
.xIAep_ static T*& get(T1*& ptr) {
%ap(=^|5 return dynamic_cast<T*> (ptr);
Y0(4]X \ey }
b<FE
};
('x]@ s|%R #endif /* TYPEUTILS_H_ */
f*%kHfaXgN Fz#@ [1, Q Q: 570508473
X>I3N?5 邮 件:
athzhang@gmail.com U["0B8 电 话:(0512) 55253348,(0) 18912671348
r+#{\~r7T 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
U7WYS8