一个简易的类型判别器 ?J> $}<e|3_ 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
Si;H0uP O MeZf*'
J 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
K_Eux rPn 代码: 全选/*
5MJS
~( * File: TypeUtils.h
#BH*Z( * Author: kwarph [
kwarph@gmail.com ]
`1IgzKL9 * Time: 2009-3-21 下午03:25:02
R`E ~ZWC4V *
$c(nF01 * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
-;WGS o */
B>P{A7Q d)Y}>@:W #ifndef TYPEUTILS_H_
TJXT-\Vk #define TYPEUTILS_H_
w@w(-F!%l 8P&:_T! template<typename T>
bdE[;+58 struct InstanceOf {
ZyFjFHe+ z 1X` o template<typename T1>
^v7gIC static bool test(const T1*& ptr) {
5">Z'+8 const T* t = dynamic_cast<const T*> (ptr);
D_zZXbNc return t != 0;
suDQ~\n }
Wt~BU. \ta?b!Y),? template<typename T1>
JYHl,HH#z static bool test(T1*& ptr) {
Y9XEP7 T* t = dynamic_cast<T*> (ptr);
Ao&"r[oJSv return t != 0;
YNsJZnGr8# }
$kp{Eg ' hZt!/?dc template<typename T1>
NyNXP_8 static const T* get(const T1*& ptr) {
' %o#q6O const T* t = dynamic_cast<const T*> (ptr);
WX3-\Y5E return t;
"87:?v[[1 }
WOL:IZX% sdw(R#GE template<typename T1>
cTT L1SW static T*& get(T1*& ptr) {
{kR#p %E] return dynamic_cast<T*> (ptr);
> /caXvS }
)bscBj@ };
][Rh28?I{ FJ)$f?=Qd #endif /* TYPEUTILS_H_ */
n,WqyNt* s`~IUNJ@P Q Q: 570508473
gV_}-VvP 邮 件:
athzhang@gmail.com k~1?VQ+?M 电 话:(0512) 55253348,(0) 18912671348
>}6%#CAf 地 址:江苏省 昆山市 前进西路1088号虹桥大厦 2单元 6楼
3L}A3de'