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