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
(需要编译器支持)。
本文作者:Gold_stein
本文链接:https://www.cnblogs.com/smartljy/p/18696453
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?