带有验证的C++编译时类名字符串
C++ compile-time class name string with validation
我想要一种在编译时从类中获取字符串的方法,但如果该类不在作用域中,我也想要一个错误,所以这还不够:
#define CLASS_STR(c) # c
我想我可以写一个构建后的脚本作为某种静态分析器
一个例子是libextobjc中的密钥路径检查http://devetc.org/code/2014/05/17/safe-and-sane-key-paths.html
它应该很容易掌握,真的。与其写"MyClass",不如使用一个可以在字符串中返回类名的宏,同时确保该类在作用域中可见。
这里有一种方法:
#include <iostream>
#include <MyLib/MyClass.h>
#define CLASS_STR(__class__)
({
__class__ *x;
#__class__ ;
})
int main(int argc, char* argv[]) {
auto className = CLASS_STR(MyClass);
std::cout << className << std::endl;
return 0;
}
请注意,如果我将MyKlass
传递给宏,它将无法初始化指针,所以现在我在编译时检查该类是否可用。检查之后,我得到一个字符串,它保证表示该类。
当然,可以很容易地为发布版本重新定义宏,以执行字符串化。