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特性,不过按现在的发布版本来看,应该不是问题了~``