一个简易的类型判别器 ^ ,U9N Nx;U]O6A 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
L5of(gQ5] EM;]dLh 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
N6EH 代码: 全选/*
q%"]}@a0 * File: TypeUtils.h
Q pAK] * Author: kwarph [
kwarph@gmail.com ]
;0P2nc:U~ * Time: 2009-3-21 下午03:25:02
#:w/vk *
6}n>Nb;L" * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
Qp!r_a&
*/
a@lvn/b2 tlQ3BKp #ifndef TYPEUTILS_H_
kdITh9nx<r #define TYPEUTILS_H_
PDzVXLpC s==gjA e: template<typename T>
iAbtv^fn struct InstanceOf {
mz3!HksZ" 6#K1LY5 } template<typename T1>
{SbA(a?B static bool test(const T1*& ptr) {
y 7|x<Z const T* t = dynamic_cast<const T*> (ptr);
h$G&4_O return t != 0;
9L]x9lI; }
Bk?3lwCT j$n[;\]n template<typename T1>
wz$1^ml static bool test(T1*& ptr) {
/^
hB6_'D T* t = dynamic_cast<T*> (ptr);
qeb:n$ return t != 0;
RN]4 Is: }
tb/bEy^
8AOJ'~$ template<typename T1>
OTl\^! static const T* get(const T1*& ptr) {
$e_A( | const T* t = dynamic_cast<const T*> (ptr);
KaZ*HPe( return t;
O+@"l$;N }
{Fta4D_1N d/+sR@\ template<typename T1>
^EN_C<V;"d static T*& get(T1*& ptr) {
#|
`W ] return dynamic_cast<T*> (ptr);
q<>LK }
6K5KZZG
};
1%G<gbHpI /KO!s,Nk #endif /* TYPEUTILS_H_ */
s{2BG9s L L7a20 Q Q: 570508473
l&dHH_m3 邮 件:
athzhang@gmail.com E#URTt:&> 电 话:(0512) 55253348,(0) 18912671348
#'mb9GWD3 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
KxqT5`P&