一个简易的类型判别器 4#7*B yvf 9xhc:@B1J 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
5E"^>z M?L$xE_& 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
g}W|q"l?i 代码: 全选/*
;b~\[ * File: TypeUtils.h
(_<,Oj#*S * Author: kwarph [
kwarph@gmail.com ]
t89Tt @cf * Time: 2009-3-21 下午03:25:02
a!-J=\>9 *
c.b| RM0; * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
**kix */
>:> W= .RJMtmp #ifndef TYPEUTILS_H_
pr7lm5 #define TYPEUTILS_H_
#vxq|$e m%apGp'=1 template<typename T>
KR%WBvv struct InstanceOf {
X!/Sk1 >5:O%zQ@ template<typename T1>
zBTW& static bool test(const T1*& ptr) {
:?BK A0E const T* t = dynamic_cast<const T*> (ptr);
S\<i`q return t != 0;
^.\O)K {h }
^]D1': -fmJkI template<typename T1>
LybaE~=
static bool test(T1*& ptr) {
geqP. MR T* t = dynamic_cast<T*> (ptr);
*|Er;Thw return t != 0;
.#$2,"8 }
}aR}ZzK/v UO@K:n template<typename T1>
VZI!rFac static const T* get(const T1*& ptr) {
3B
'j?+A const T* t = dynamic_cast<const T*> (ptr);
fz :(mZ% return t;
p^k0Rad }
)"6-7ii7(f $HsNV6 template<typename T1>
ocJG4# static T*& get(T1*& ptr) {
RK &>!^ return dynamic_cast<T*> (ptr);
*wj5( B<y }
3oMHy5 };
z]+L=+,, S7Ty}?E@ #endif /* TYPEUTILS_H_ */
Ec3tfcNhR ""a$[[ %WC Q Q: 570508473
9Pe$}N 邮 件:
athzhang@gmail.com H(K
PU1lDw 电 话:(0512) 55253348,(0) 18912671348
[K\b"^=< 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
2wIJ;rh