我想获取模板类型的字符串名称(const char*).不幸的是我无法访问RTTI.
template< typename T > struct SomeClass { const char* GetClassName() const { return /* magic goes here */; } }
所以
SomeClasssc; sc.GetClassName(); // returns "int"
这可能吗?我找不到办法,即将放弃.谢谢您的帮助.
不,它也无法使用typeid可靠.它将为您提供一些取决于编译器实现的内部字符串.像"int"这样的东西,也是"i"的东西很常见int
.
顺便说一句,如果你想要的只是比较两种类型是否相同,你不需要先将它们转换为字符串.你可以这样做
templatestruct is_same { enum { value = false }; }; template struct is_same { enum { value = true }; };
然后呢
if(is_same::value) { ... }
Boost已经有了这样一个模板,下一个C++标准也会有std::is_same
.
你可以专注于这样的类型:
templatestruct to_string { // optionally, add other information, like the size // of the string. static char const* value() { return "unknown"; } }; #define DEF_TYPE(X) \ template<> struct to_string { \ static char const* value() { return #X; } \ } DEF_TYPE(int); DEF_TYPE(bool); DEF_TYPE(char); ...
所以,你可以像使用它一样
char const *s = to_string::value();
当然,如果您希望在类型未知的情况下获得编译时错误,也可以删除主模板定义(并仅保留前向声明).我把它包括在这里完成.
我之前使用过char const*的静态数据成员,但它们会导致一些复杂的问题,比如在哪里放置声明的问题,等等.像上面这样的类专业化很容易解决问题.
另一种方法是依赖编译器内部.在GCC中,以下给出了合理的结果:
templatestd::string print_T() { return __PRETTY_FUNCTION__; }
回来std::string
.
std::string print_T() [with T = std::basic_string
, std::allocator >]
一些substr
混合的魔法find
将为您提供您寻找的字符串表示.