一个简易的类型判别器 "tDB[?
3u
s^\w# 在某些时候,我们需要判别一个对象的类型,C++提供了
RTTI(运行时类型信息)机制,比如使用
typeid 关键字,但 Bjarne 建议尽量不要使用RTTI来判定对象类别,他提倡多使用使用 dynamic_cast 替代 typeid。当然typyid能准确判定对象的类型,而dynamic_cast不一定总能告诉我们对象的确切类型。
whGtVx|zR SK*<H~2 下面是一个简单的类型判别器(不能用于基本类型,如int、double等):
P$@:T[}v 代码: 全选/*
3q6FV7Fv&b * File: TypeUtils.h
9c5DEq * Author: kwarph [
kwarph@gmail.com ]
Fa{[kJ8z * Time: 2009-3-21 下午03:25:02
"1p,
r&} *
KmWd$Qy, * Copyright (C) 2008-2009, kwarph, All Rights Reserved.
A-M6MW */
/IHF c s:E^ #ifndef TYPEUTILS_H_
64^3ve3/a= #define TYPEUTILS_H_
3b`#)y^y?% ]9wTAb template<typename T>
(I{+% struct InstanceOf {
bcAk$tA2 KsqS{VVCh template<typename T1>
|ss4pN0X static bool test(const T1*& ptr) {
k[*> nE const T* t = dynamic_cast<const T*> (ptr);
rV*Ri~Vx return t != 0;
`?d`
#)Ck }
?-<>he zOy_qozk template<typename T1>
"K;""]#wg0 static bool test(T1*& ptr) {
'=Acg"aT T* t = dynamic_cast<T*> (ptr);
/U6ry' return t != 0;
j|[ >f }
PMQlJ& e YiqT Wn: template<typename T1>
Ypinbej static const T* get(const T1*& ptr) {
$wl_ const T* t = dynamic_cast<const T*> (ptr);
)t2 eg1a: return t;
c;n\HYk }
Lg-!,Y
2cZgG^ template<typename T1>
ajf(Ii\/ static T*& get(T1*& ptr) {
Pv*]AF;9pQ return dynamic_cast<T*> (ptr);
Oz<#s{Z }
"DX2Mu= };
/38XaKc{6 y3P4]sq #endif /* TYPEUTILS_H_ */
mKUm*m#<