C++中能否用std::type_info::name()判断类型是否为指针?
判断模板类型是否为指针:std::type_info::name() 是否可靠?
绝对不要用std::type_info::name()来判断类型是否为指针,这种方式完全不可靠,原因如下:
std::type_info::name()的返回值是实现定义的,C++标准没有规定它的输出格式。你看到的前缀"P"只是GCC/Clang这类编译器的输出风格,换成MSVC的话,指针类型会输出类似int *的字符串,根本没有"P"前缀。- 就算是同一编译器,不同版本、不同编译选项下,返回的字符串都可能发生变化,完全没有稳定性保证。
正确的实现方式
用C++标准库提供的类型特性std::is_pointer,定义在<type_traits>头文件中,这是标准规定的可靠方案。
示例代码:
#include <type_traits> #include <iostream> template<typename T> void check_pointer_type() { // C++17及以上可用is_pointer_v,C++11/14用std::is_pointer<T>::value if (std::is_pointer_v<T>) { std::cout << "T 是指针类型\n"; } else { std::cout << "T 不是指针类型\n"; } } int main() { check_pointer_type<int*>(); // 输出:T 是指针类型 check_pointer_type<int>(); // 输出:T 不是指针类型 check_pointer_type<void(*)()>(); // 函数指针也会被正确识别 return 0; }
注意:std::is_pointer仅识别对象指针和函数指针。如果需要判断成员指针(比如int Class::*这类类型),要使用std::is_member_pointer,这也是标准库提供的可靠类型特性。
内容的提问来源于stack exchange,提问作者Gamaray
相关产品推荐
相关产品推荐

