📅  最后修改于: 2023-12-03 15:26:45.396000             🧑  作者: Mango
在 C++ 中,类型是一个非常重要的概念。正确地理解和使用类型可以避免许多错误和问题。在编写 C++ 代码时,经常需要检查变量的类型。本文将介绍 C++ 中常用的检查变量类型的方法。
typeid
是 C++ 中一个用于查询对象类型的运算符。可以使用 typeid
来获取对象的类型信息,例如:
#include <iostream>
#include <typeinfo>
int main() {
int i = 0;
std::cout << typeid(i).name() << std::endl; // 输出 "int"
return 0;
}
typeid(i)
返回的类型是 const std::type_info&
,调用 name()
方法可以获取类型的字符串表示。
需要注意的是,typeid
对非多态类型的对象(即没有虚函数的类型)求值时,返回的类型信息是在编译期确定的;而对多态类型的对象求值时,返回的类型信息是在运行期确定的。
#include <iostream>
#include <typeinfo>
class A {
public:
virtual void foo() {}
};
int main() {
A a;
std::cout << typeid(a).name() << std::endl; // 输出 "class A"
A& b = a;
std::cout << typeid(b).name() << std::endl; // 输出 "class A"
A* c = &a;
std::cout << typeid(c).name() << std::endl; // 输出 "class A*"
return 0;
}
另一种检查变量类型的方法是使用模板函数。可以定义一个模板函数,用不同的类型参数进行实例化,来检查变量的类型。例如:
#include <iostream>
#include <type_traits>
template <typename T>
void foo(T t) {
if (std::is_same<T, int>::value) {
std::cout << "int" << std::endl;
} else if (std::is_same<T, float>::value) {
std::cout << "float" << std::endl;
} else {
std::cout << "unknown type" << std::endl;
}
}
int main() {
foo(1);
foo(0.1);
foo("hello");
return 0;
}
上面的代码中,使用了 <type_traits>
头文件中的 is_same
类型特性,来比较类型是否相同。
C++11 引入了类型推导的概念。可以使用 auto
或 decltype
关键字,让编译器根据变量的初始值推导出变量的类型。例如:
#include <iostream>
#include <typeinfo>
int main() {
auto i = 1;
std::cout << typeid(i).name() << std::endl; // 输出 "int"
decltype(i) j = 1.0;
std::cout << typeid(j).name() << std::endl; // 输出 "int"
return 0;
}
上面的代码中,auto
和 decltype
都可以检查变量的类型并赋值给另一个变量。
需要注意的是,使用 auto
推导出的变量类型是值类型;而使用 decltype
推导出的变量类型是引用类型。