如何用C++获取运行时变量的类型

上一篇 / 下一篇  2012-08-20 09:30:25 / 个人分类:C++

51Testing软件测试网)uws2lW(t

  在上数据库实现技术的时候,老师提到了一个问题:如何在运行时获取一个变量的类型,这用C实现好像要大费周折。今天正好碰到一个问题想看看C++STL中的sort算法的实现,发现里面有个技巧可以很容易做到这一点。我就立刻自己做了一个实验。如下可以获取运行时变量的类型。51Testing软件测试网7i4C?&T7T,j

fXvTd-}it0b0   其中心思想就是,运用模板函数的重载,是什么类型的参数就去调用参数是那个类型的函数。这样就让编译器去自己识别,而编译器当然知道每个变量的类型。这 让我想去探究那些我经常用到的STL算法的实现,如果你也经常使用,何不借此机会好好研究一下呢?我感觉至少有几个好处。51Testing软件测试网#lt Qn]rL po5\:g

51Testing软件测试网:`4M[GoK1a

  1、增强对C++语言的理解

y0Om{Iy;`8I]0

CR,E.q5h u:F_o0  2、增强程序的设计能力51Testing软件测试网;jF$[5ML:F&r"CZ

51Testing软件测试网b2a]J7L.kK

  3、增强算法分析与设计的能力

&Me|] y7g-h)j E*L0

cCff c[e4w0#include<iostream>51Testing软件测试网t#z&h%nr c/E_Yr%U
using namespace std;

H l1{ zMe%ZL1Fk0

Ew!?:i*c0void PrintType(int t)
BV WO:aPc+W0{51Testing软件测试网:fN2`QuY*mW5n Z
  cout<<"int type";51Testing软件测试网!S*euA!`
}51Testing软件测试网'q!xUD F4d \ ]
void PrintType(char t)51Testing软件测试网tYy:[,c z3h:I
{
Q^*j3x%Mdt)SsR0  cout<<"char type";51Testing软件测试网5q/X Xw0f&Jc
}51Testing软件测试网!{4i.}(k*E(kg
void PrintType(long t)
V0f0MJDx'WN W0{51Testing软件测试网&H7t/`8Id6mV%X
  cout<<"long type";51Testing软件测试网W6p;r,]}[n Z:I5J'd(m
}

*_KRb7|?y]0

U^}/KD'c4_!B5i.N0template<typename T> inline51Testing软件测试网m$Y1A;fI-KQ m|Q6?
void ValueType(T t)51Testing软件测试网h_v|f U*t
{
-F&a;P n:r7|]}4K0  PrintType(t);51Testing软件测试网1N R oi@(BE Y2k
}

.wrH3pY!b-u8@ C@051Testing软件测试网 U(e6gs lY4o Pe

int main()
i}G:S.HNq"k0{51Testing软件测试网nUN ];k$l
  int a;
5[j:zTp#K*G0  char c;
7p,Q5i$CpTomh0  ValueType(a);cout<<endl;51Testing软件测试网Q B3FJ+H'o0p
  ValueType(c);cout<<endl;
_/YK0w g!L,mRE0  return 0;
,i-He-Me!d[0}

eR^k"n:p0

KT mja;_X%t3k0   上例的功能很容易扩展,如果你向自己的项目添加了一个新的类型,那么只要重载一个PrintValue( )即可。这仅仅是输出变量的类型,如果你还想再获取变量的类型的时候做更多的事情的话,显然也是很容易做到的。比如你想先获取变量的类型,这样之后才能确 定分配给变量多少空间,那么这个也可以轻松实现,只需要改变PrintValue的功能即可。这里可以写一个int PrintValue(YourType t),她甚至应该有一个更好的名字比如int Memory(Type t)。51Testing软件测试网;U6~ F o v"YrQ8G)}

ZO']6?G0  在不改变函数名的同时对上述函数稍加修改就可以实现输出传入参数应该分配的内存大小。51Testing软件测试网^9[${6d6i-kOs a u

z4R!_A E4K^u8f0#include<iostream>51Testing软件测试网'}-E y$t+Iy
using namespace std;

)b'Rim+X t x^-M051Testing软件测试网6Y3p o)c5\?

int PrintType(int t)
:F;u,Z,F"?2o.OA0{51Testing软件测试网b.nI*J ^"l)j}
 cout<<"int type ";51Testing软件测试网*i-@ tg%M+S0J$B `Z
 return sizeof(int);
R*tQ6Uc0}
ml/q o"S0int PrintType(char t)
6Wk [3vxtAa0{
*i2N?9PI@0Kz0 cout<<"char type ";
NId"d0y1e!}0 return sizeof(char);
XG u4Qht? ] l+_b OQ0}
^)x2PJ x0@0int PrintType(long t)
_;NX |jl"~0{51Testing软件测试网!["t l6q~$}g6egg3K
 cout<<"long type ";51Testing软件测试网8mM9J&cE#w^
 return sizeof(long);51Testing软件测试网 RW'JL7}pz&M
}
51Testing软件测试网m ]_E^E$P

51Testing软件测试网!g+zxbT!w%Qt4gd

template<typename T> inline51Testing软件测试网8Du-v%@~*}TO
int ValueType(T t)51Testing软件测试网Fjg L%mI$r5^
{51Testing软件测试网J%c~#l;fI
 return PrintType(t);
,a[K"c9H9h_0}

j r V/SVJ+h0

JTp8s8v0int main()51Testing软件测试网I4JS;Hy6l2pOi h
{
,H7V J3Po)T*m W0 int a;51Testing软件测试网%Kz D {;G~Xj
 char c;51Testing软件测试网bC(P9B ^9[;@7P
 cout<<ValueType(a)<<" bytes need"<<endl;51Testing软件测试网4av4T5k1Rj`hq
 cout<<ValueType(c)<<" bytes need"<<endl;51Testing软件测试网{i\(I;Vx3v"@
 return 0;51Testing软件测试网Pusf ~
}

4ULB(WH8\d r'@0

51Testing软件测试网o [A1tI$VS*Km


TAG:

 

评分:0

我来说两句

Open Toolbar