辅导:通用C++typeid实现(不支持RTTI)v0.2
来源:优易学  2011-11-10 13:40:42   【优易学:中国教育考试门户网】   资料下载   IT书店
 介绍一个通用c++ typeid实现.
  主要功能:
  通用的typeid实现,可以在VS60/VS2005以及mingw32下保证相同的类型名输出.
  程序使用boost::type_traits来实现,没有使用内置的typeid.不支持RTTI操作.
  局限:
  目前版本v0.2仅实现一层function_ptr和member_function_ptr解析操作.
  版本历史:
  v0.2 不再使用std::string.去除了std_name成员函数
  将 vfc::type_id_t<T>::name() 更改为 vfc::type_id_t<T>().name()
  项目地址:
  http://code.google.com/p/typeid
  主要类介绍:
  template<typename T> vfc::type_id_t<> 获取类型的typeid名
  template<typename T> vfc::type_id(const T & t) 获取变量的类型的type_id_t类型.
  主要函数:
  type_id_t<int>().name() 输出 const char * 类型的typename
  type_id(100).name() 输出 const char * 类型的typename
  定义类型:
  VFC_TYPE_ID(type,id) 实现类型的定义,type为类型,id为类型自定义数值标识
  例: VFC_TYPE_ID(std::string,0x2001)
  下面给出一个完整的例子:
  1 #include <stdio.h>
  2 #include "vfc_type.h"
  3
  4 struct a
  5 {
  6 const int * test(int,int)
  7 {
  8 return NULL;
  9 }
  10
  11 void test1() const
  12 {
  13 }
  14 const char * test2(int, int) volatile
  15 {
  16 return NULL;
  17 }
  18 const int & test3(int *, const char *) const volatile
  19 {
  20 static int i = 100;
  21 return i;
  22 }
  23 };
  24
  25 void test(const char *, int k)
  26 {
  27 };
  28
  29 VFC_TYPE_ID(a,0x2000);
  30
  31
  32 int main(int argc, char* argv[])
  33 {
  34 typedef void (*T1)(void);
  35 typedef int (*T2)(void);
  36 typedef int (*T3)(int,int,int,int,int,int,int,int,int);
  37 typedef const char * (*T4)(int &,int *,char **,char &,const int &);
  38
  39 typedef int U1;
  40 typedef int U2[5];
  41 typedef const int & U3;
  42 typedef char U4[5][6][7];
  43
  44 printf("T1 type %s\n",vfc::type_id_t<T1>().name());
  45 printf("T2 type %s\n",vfc::type_id_t<T2>().name());
  46 printf("T3 type %s\n",vfc::type_id_t<T3>().name());
  47 printf("T4 type %s\n",vfc::type_id_t<T4>().name());
  48
  49 printf("U1 type %s\n",vfc::type_id_t<U1>().name());
  50 printf("U2 type %s\n",vfc::type_id_t<U2>().name());
  51 printf("U3 type %s\n",vfc::type_id_t<U3>().name());
  52 printf("U4 type %s\n",vfc::type_id_t<U4>().name());
  53
  54 printf("\'d\' type %s\n",vfc::type_id('d').name());
  55 printf("100 type %s\n",vfc::type_id(100).name());
  56 printf("100.0 type %s\n",vfc::type_id(100.0).name());
  57 printf("\"str\" type %s\n",vfc::type_id("str").name());
  58
  59 const char * str = "ok";
  60 printf("const char * str type %s\n",vfc::type_id(str).name());
  61
  62 a * pa;
  63 printf("a type %s\n",vfc::type_id_t<a>().name());
  64 printf("pa type %s\n",vfc::type_id(pa).name());
  65 printf("a::test type %s\n",vfc::type_id(&a::test).name());
  66 printf("a::test type %s\n",vfc::type_id(&a::test1).name());
  67 printf("a::test type %s\n",vfc::type_id(&a::test2).name());
  68 printf("a::test type %s\n",vfc::type_id(&a::test3).name());
  69 printf("test %s\n",vfc::type_id(&test).name());
  70
  71 typedef int (a::*TT)(const int *,char) const volatile;
  72 const TT * tt;
  73 printf("TT type %s\n",vfc::type_id_t<TT>().name());
  74 printf("const TT * type %s\n",vfc::type_id(tt).name());
  75
  76 return 0;
  77 }
  78 在VC60/ VC2003/VC2005/MinGW32下输出相同运行结果
  T1 type void (*)()
  T2 type int (*)()
  T3 type int (*)(int,int,int,int,int,int,int,int,int)
  T4 type char const * (*)(int &,int *,char * *,char &,int const &)
  U1 type int
  U2 type int [5]
  U3 type int const &
  U4 type char [7] [6] [5]
  'd' type char
  100 type int
  100.0 type double
  "str" type char [4]
  const char * str type char const *
  a type a
  pa type a *
  a::test type int const * (a::*)(int,int)
  a::test type void (a::*)()const
  a::test type char const * (a::*)(int,int)volatile
  a::test type int const & (a::*)(int *,char const *)const volatile
  test void (*)(char const *,int)
  TT type int (a::*)(int const *,char)const volatile
  const TT * type int (a::*const *)(int const *,char)const volatile

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训