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(需要编译器支持)。

本文作者:Gold_stein

本文链接:https://www.cnblogs.com/smartljy/p/18696453

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Gold_stein  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 逃离地面 RAD & 三浦透子
逃离地面 - RAD & 三浦透子
00:00 / 00:00
An audio error has occurred.

作词 : 野田洋次郎

作曲 : 野田洋次郎

空飛ぶ羽根と引き換えに 繋ぎ合う手を選んだ僕ら

それでも空に魅せられて 夢を重ねるのは罪か

夏は秋の背中を見て その顔を思い浮かべる

憧れなのか、恋なのか 叶わぬと知っていながら

重力が眠りにつく 1000年に一度の今日

太陽の死角に立ち 僕らこの星を出よう

彼が眼を覚ました時 連れ戻せない場所へ

「せーの」で大地を蹴って ここではない星へ

行こう

もう少しで運命の向こう もう少しで文明の向こう

もう少しで運命の向こう もう少しで

夢に僕らで帆を張って 来たるべき日のために夜を超え

いざ期待だけ満タンで あとはどうにかなるさと 肩を組んだ

怖くないわけない でも止まんない

ピンチの先回りしたって 僕らじゃしょうがない

僕らの恋が言う 声が言う

「行け」と言う