visualfc

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  42 随笔 :: 0 文章 :: 119 评论 :: 0 Trackbacks
原创 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(intintvolatile
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 *,charconst 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


posted on 2008-11-04 22:30 visualfc 阅读(1590) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理