C++获取变量类型
C++获取变量类型
内容
在现代 C++(C++11 及以上)中,可以使用 decltype 和 typeid 来获取变量的类型,并结合 std::type_info 进行输出。此外,C++17 之后,std::type_name(C++20)可以更加直观地获取类型名称。
1. 使用 typeid 和 type_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(需要编译器支持)。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号