原创 visualfc
介绍一个通用c++ typeid实现.
主要功能:
通用的typeid实现,可以在VS60/VS2005以及mingw32下保证相同的类型名输出.
程序使用boost::type_traits来实现,没有使用内置的typeid.不支持RTTI操作.
项目地址:
http://code.google.com/p/typeid程序例子:
- vfc::type_id(100).name();
- vfc::type_id_t<int>::name();
- vfc::type_id_t<const int &>::name();
- struct a
- {
- const int * test(int, const char *);
- };
- VFC_MAKE_ID(a,0x2003);
- vfc::type_id(&a::test).name();
主要类介绍:
template<typename T> vfc::type_id_t<> 获取类型的typeid名
template<typename T> vfc::type_id(const T & t) 获取变量的类型的type_id_t类型.
主要函数:
type_id(100).std_name() 输出 std::string 类型的name
type_id(100).name() 输出 const char * 类型的name
定义类型:
VFC_TYPE_ID(type,id) 实现类型的定义,type为类型,id为类型自定义数值标识
例: VFC_TYPE_ID(std::string,0x2001)
下面给出一个完整的例子:
- #include "vfc_type.h"
- struct a
- {
- const int * test(int,int)
- {
- return NULL;
- }
- void test1() const
- {
- }
- const char * test2(int, int) volatile
- {
- return NULL;
- }
- const int & test3(int *, const char *) const volatile
- {
- static int i = 100;
- return i;
- }
- };
- void test(const char *, int k)
- {
- };
- VFC_TYPE_ID(a,0x2000);
- int main(int argc, char* argv[])
- {
- typedef void (*T1)(void);
- typedef int (*T2)(void);
- typedef int (*T3)(int,int,int,int,int,int,int,int,int);
- typedef const char * (*T4)(int &,int *,char **,char &,const int &);
- typedef int U1;
- typedef int U2[5];
- typedef const int & U3;
- typedef char U4[5][6][7];
- printf("T1 type %s\n",vfc::type_id_t<T1>::name());
- printf("T2 type %s\n",vfc::type_id_t<T2>::name());
- printf("T3 type %s\n",vfc::type_id_t<T3>::name());
- printf("T4 type %s\n",vfc::type_id_t<T4>::name());
- printf("U1 type %s\n",vfc::type_id_t<U1>::name());
- printf("U2 type %s\n",vfc::type_id_t<U2>::name());
- printf("U3 type %s\n",vfc::type_id_t<U3>::name());
- printf("U4 type %s\n",vfc::type_id_t<U4>::name());
- printf("\'d\' type %s\n",vfc::type_id('d').name());
- printf("100 type %s\n",vfc::type_id(100).name());
- printf("100.0 type %s\n",vfc::type_id(100.0).name());
- printf("\"str\" type %s\n",vfc::type_id("str").name());
- const char * str = "ok";
- printf("const char * str type %s\n",vfc::type_id(str).name());
- a * pa;
- printf("a type %s\n",vfc::type_id_t<a>::name());
- printf("pa type %s\n",vfc::type_id(pa).name());
- printf("a::test type %s\n",vfc::type_id(&a::test).name());
- printf("a::test type %s\n",vfc::type_id(&a::test1).name());
- printf("a::test type %s\n",vfc::type_id(&a::test2).name());
- printf("a::test type %s\n",vfc::type_id(&a::test3).name());
- printf("test %s\n",vfc::type_id(&test).name());
- return 0;
- }
在VS60,VS2005和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)