一个简易的类型判别器 yPmo1|'X>d KF&8l/f 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
1a9' *[ ,%Z&*/*Oh 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
:#vA5kC 代码: 全选/*
;r2DQg"#@ * File: TypeUtils.h
to13&#o * Author: kwarph [
kwarph@gmail.com ]
kQU4s)J * Time: 2009-3-21 下午03:25:02
%x#S?GMV< *
Ip{hg,> * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
Zs^zD;zU */
YAR$6& Eet/l]e#a #ifndef TYPEUTILS_H_
t[k ['<G #define TYPEUTILS_H_
z~ Zm1tZs iM!V4Wih6 template<typename T>
"u^2!d struct InstanceOf {
;nh_L( mmwc'-jU: template<typename T1>
)[Rwc#PA; static bool test(const T1*& ptr) {
I!F&8B+| const T* t = dynamic_cast<const T*> (ptr);
zk }SEt- return t != 0;
4grV2xtX }
fBTNI`# &7kLSb&|; template<typename T1>
xe OfofC(l static bool test(T1*& ptr) {
)j]f
]8 T* t = dynamic_cast<T*> (ptr);
%D-!<)z return t != 0;
Wv3p!zW3I }
v+EJ
$ a%y*e+oM template<typename T1>
?b d&Av static const T* get(const T1*& ptr) {
GQ
Flt_ const T* t = dynamic_cast<const T*> (ptr);
*#p}FB2H# return t;
e8SAjl"} }
F6{
O x15&U\U template<typename T1>
;t
N@ static T*& get(T1*& ptr) {
s'/_0 return dynamic_cast<T*> (ptr);
v7j/_;JE; }
0XE6Hw };
5 3+C;]J Fbotn(\h@ #endif /* TYPEUTILS_H_ */
K\}qYdPF 5:+x7Ed Q Q: 570508473
WO69Wo\C 邮 件:
athzhang@gmail.com Yk{4 3yw 电 话:(0512) 55253348,(0) 18912671348
FBi&MZ` 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
1"A"AMZf