📅  最后修改于: 2023-12-03 14:50:52.418000             🧑  作者: Mango
C++ 中的 typeid 运算符可用于获取表达式的类型信息,需要注意的是,表达式必须是一个类型或一个对象。
代码示例:
#include <iostream>
#include <typeinfo>
int main()
{
int a = 0;
std::cout << typeid(a).name() << std::endl;
return 0;
}
输出结果:
i
上述代码中,a
的类型为 int
,则 typeid(a)
返回的是一个指向 type_info
对象的引用,使用 name()
成员函数可以返回 type_info
对象的名称,即为 i
,表示 int
类型。
需要注意的是,返回的名称通常是经过具体实现解释的,具体的名称可能依赖于操作系统、编译器和编译选项等,因此在使用时需要注意谨慎。
C++ 11 中的 decltype 关键字可以用于获取表达式的类型,甚至可以获取未命名的表达式类型。
代码示例:
#include <iostream>
int main()
{
int a = 0;
decltype(a) b = a;
std::cout << typeid(b).name() << std::endl;
return 0;
}
输出结果:
i
上述代码中,decltype(a)
返回的是 a
的类型 int
,将其赋值给 b
后,则 b
的类型也是 int
。
需要注意的是,decltype(x)
中的 x
可以是任意表达式,不一定是一个已命名的变量,这在模板编程中经常使用。
C++ 17 中引入的模板推导技术可以用于获取表达式的类型,可以将一个表达式转化为一个泛型类型,然后通过模板参数推导来获取其类型信息。
代码示例:
#include <iostream>
#include <type_traits>
template <typename T>
void foo(const T& t)
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
int a = 0;
foo(a);
return 0;
}
输出结果:
i
上述代码中,将 a
作为参数传递给了 foo
函数,函数中的模板参数 T
就能从 a
推导出来对应的类型 int
。
需要注意的是,这种方式需要用户手动调用函数并将变量作为参数传递给函数,在某些场景下可能不太方便使用。
以上是三种获取变量类型的方法,每种方法都有其特点和应用场景,需要根据实际需求进行选择。需要注意的是,在实际使用中,不同的编译器和编译选项可能会对输出结果产生影响,需要进行测试和验证。