一个简易的类型判别器 [NeOd77y fhMtnh: 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
9S=9m[#y' hS*3yCE"8 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
zoC/Hm 代码: 全选/*
Y<w2_ +( * File: TypeUtils.h
yHr/i) c * Author: kwarph [
kwarph@gmail.com ]
/
DeIs * Time: 2009-3-21 下午03:25:02
EZ1H0fm *
SQ>.P * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
~S"G~a(&j */
#OJ^[Zi< S$BwOx3QF #ifndef TYPEUTILS_H_
uPR usG4!R #define TYPEUTILS_H_
Z(/jQ=ozQ vB/MnEKR template<typename T>
R/ l1$} struct InstanceOf {
ouVR[w>V xzW]D0o0 template<typename T1>
^uIZs}=+ static bool test(const T1*& ptr) {
wbd>By(T1 const T* t = dynamic_cast<const T*> (ptr);
-H Zvz[u return t != 0;
O:xRUjpL }
HxU.kcf q6H90Zb template<typename T1>
!rTh+F* static bool test(T1*& ptr) {
$Jb+}mlT T* t = dynamic_cast<T*> (ptr);
JaG<.ki return t != 0;
ZzzQXfA# }
@L{HT8utK3 [ {lF1+];@ template<typename T1>
{s=QwZdR static const T* get(const T1*& ptr) {
aina6@S const T* t = dynamic_cast<const T*> (ptr);
&IXr*I return t;
sKn>K/4JZ }
:E4i@ O7% cU%#oEMf< template<typename T1>
uZm<:d2%) static T*& get(T1*& ptr) {
A-ir return dynamic_cast<T*> (ptr);
> ^n' }
f`/JY!uj{ };
;P5\EJo [rqq*_eB #endif /* TYPEUTILS_H_ */
lQi2ym? f+fF5Z\ Q Q: 570508473
Pa0tf: 邮 件:
athzhang@gmail.com f[ %\LHq 电 话:(0512) 55253348,(0) 18912671348
P0'
;65 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
&vdGKYs 6