C++获取变量类型

C++获取变量类型

内容

在现代 C++(C++11 及以上)中,可以使用 decltypetypeid 来获取变量的类型,并结合 std::type_info 进行输出。此外,C++17 之后,std::type_name(C++20)可以更加直观地获取类型名称。

1. 使用 typeidtype_info

#include <iostream>
#include <typeinfo>

int main() {
    int x = 42;
    std::cout << "Type of x: " << typeid(x).name() << std::endl;
    return 0;
}

优点

  • typeid(x).name() 获取变量 x 的类型。
  • typeid 适用于运行时,可以用于基类指针指向派生类的情况。

缺点

  • typeid(x).name() 的结果通常是编译器特定的,不一定是直观的类型名称。例如,在某些编译器(如 GCC)下,可能返回 i 代表 int
  • 需要 c++filt(如 c++filt -t)来解码编译器特定的名称。

2. 使用 decltype

#include <iostream>
#include <typeinfo>

template <typename T>
void printType() {
    std::cout << "Type: " << typeid(T).name() << std::endl;
}

int main() {
    int x = 42;
    printType<decltype(x)>();
    return 0;
}

优点

  • decltype(x) 可用于泛型编程和模板推导。
  • 结合 typeid(T).name() 可用于编译时推导类型。

3. 使用 C++17 std::is_same

#include <iostream>
#include <type_traits>

int main() {
    int x = 42;
    if (std::is_same_v<decltype(x), int>) {
        std::cout << "x is of type int" << std::endl;
    }
    return 0;
}

优点

  • std::is_same_v<T, U> 在编译期进行类型比较,不涉及运行时开销。

4. 使用 C++20 std::type_name(GCC/Clang 支持)

#include <iostream>
#include <string_view>

template <typename T>
constexpr std::string_view type_name() {
#ifdef __clang__
    return __PRETTY_FUNCTION__;
#elif defined(__GNUC__)
    return __PRETTY_FUNCTION__;
#elif defined(_MSC_VER)
    return __FUNCSIG__;
#else
    return "Unknown";
#endif
}

int main() {
    int x = 42;
    std::cout << "Type of x: " << type_name<decltype(x)>() << std::endl;
    return 0;
}

优点

  • 直接获取可读的类型信息,无需 typeid().name() 的额外转换。
  • 兼容 C++20 及以上。

缺点

  • std::type_name 可能依赖具体编译器的实现。

结论

如果你使用 C++11 或更高版本:

  • 获取变量的类型:使用 decltype
  • 在运行时输出类型:使用 typeid(x).name()
  • 在编译时比较类型:使用 std::is_same_v
  • 获取可读的类型信息(C++20+):使用 std::type_name(需要编译器支持)。
posted @ 2025-02-01 19:45  Gold_stein  阅读(30)  评论(0编辑  收藏  举报