不,它也不能可靠地与 typeid 一起工作。它会给你一些取决于编译器实现的内部字符串。像“int”之类的东西,但“i”也很常见int
.
顺便说一句,如果您只想比较两种类型是否相同,则不需要先将它们转换为字符串。你可以这样做
template<typename A, typename B>
struct is_same { enum { value = false }; };
template<typename A>
struct is_same<A, A> { enum { value = true }; };
然后做
if(is_same<T, U>::value) { ... }
Boost已经有了这样的模板,下一个C++标准也会有std::is_same
too.
手动注册类型
您可以专门研究这样的类型:
template<typename>
struct 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<X> { \
static char const* value() { return #X; } \
}
DEF_TYPE(int); DEF_TYPE(bool); DEF_TYPE(char); ...
所以,你可以像这样使用它
char const *s = to_string<T>::value();
当然,如果您想在类型未知的情况下获得编译时错误,您也可以删除主模板定义(并仅保留前向声明)。我只是将其包含在这里以完成。
我以前使用过 char const* 的静态数据成员,但它们会导致一些复杂的问题,例如在哪里放置它们的声明等问题。像上面这样的类专业化很容易解决这个问题。
自动,取决于 GCC
另一种方法是依赖编译器内部。在 GCC 中,以下给出了合理的结果:
template<typename T>
std::string print_T() {
return __PRETTY_FUNCTION__;
}
返回为std::string
.
std::string print_T() [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]
Some substr
魔法与find
将为您提供您要查找的字符串表示形式。