原创 visualfc
介绍一个通用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