You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:07:12