📜  检查变量类型 c++ (1)

📅  最后修改于: 2023-12-03 15:26:45.396000             🧑  作者: Mango

检查变量类型 C++

在 C++ 中,类型是一个非常重要的概念。正确地理解和使用类型可以避免许多错误和问题。在编写 C++ 代码时,经常需要检查变量的类型。本文将介绍 C++ 中常用的检查变量类型的方法。

使用 typeid

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 引入了类型推导的概念。可以使用 autodecltype 关键字,让编译器根据变量的初始值推导出变量的类型。例如:

#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;
}

上面的代码中,autodecltype 都可以检查变量的类型并赋值给另一个变量。

需要注意的是,使用 auto 推导出的变量类型是值类型;而使用 decltype 推导出的变量类型是引用类型。