C++ 返回当前类名

标准C++库并不支持反射机制, 自然没有现成返回类信息的方法;

Qt用久了,在元对象系统支持下返回类信息很容易,一旦脱离Qt环境,如何利用标准C++库直接实现类似返回类名,最近突发奇想,起用预定义宏来提取当前类名,暂时符合目前的项目需求,通用性方面仅供参考:)

step1. 在基类头文件中定义宏信息;

1 #define CLASS_INFO \
2   virtual std::string __className() { \
3     std::string nameBuffer( __FUNCTION__ ); \
4     std::smatch result; \
5     std::regex pattern( "(\\w+)::" ); \
6     std::regex_search( nameBuffer, result, pattern ); \
7     return result[1]; \
8   }

step2. 在基类中添加相应的宏及提取方法;

 1 class BaseClass
 2 {
 3   CLASS_INFO;
 4 
 5 public:
 6 
 7   std::string className() {
 8     return __className();
 9   }
10 
11   ......
12 
13 };

step3. 在派生类中只需要添加CLASS_INFO即可。

至此,返回类名的功能就简单的实现了;在linux中将 __FUNCTION__ 改成 __PRETTY_FUNCTION__

一个完整的实例

 1 #include <iostream>
 2 #include <string>
 3 #include <regex>
 4 
 5 #define CLASS_INFO \
 6   virtual std::string __className() { \
 7     std::string nameBuffer( __FUNCTION__ ); \
 8     std::smatch result; \
 9     std::regex pattern( "(\\w+)::" ); \
10     std::regex_search( nameBuffer, result, pattern ); \
11     return result[1]; \
12   }
13 
14 class baseClass
15 {
16   CLASS_INFO;
17 
18 public:
19 
20   std::string className() {
21     return __className();
22   }
23 
24 };
25 
26 class childClass : public baseClass
27 {
28   CLASS_INFO;
29 
30 };
31 
32 int main ()
33 {
34   baseClass* instA = new baseClass;
35   std::cout << instA->className() << std::endl;
36 
37   baseClass* instB = new childClass;
38   std::cout << instB->className() << std::endl;
39 
40   return 0;
41 }

 程序中起用了正则表达式, 编译器得支持C++0x特性,不过按现在的发布版本来看,应该不是问题了~``

posted @ 2012-12-08 11:34  lefttime  阅读(3901)  评论(0编辑  收藏  举报