typeid学习
1、概述
typeid是运行时类型识别,可以在运行时判断一个变量或对象的类型。
2、应用场景
2.1、在继承体系中判断具体对象类型
场景:假如函数参数是基类指针,但是可能指向派生类对象,想判断实际指向的哪个类。
#include <iostream>
#include <typeinfo>
using namespace std;// 基类:代表不同类型的员工
class Employee {
public:virtual ~Employee() {} // 必须有虚函数才能使用 typeid 正确识别多态类型virtual void work() = 0;
};class Engineer : public Employee {
public:void work() override { cout << "工程师在写代码" << endl; }
};class Manager : public Employee {
public:void work() override { cout << "经理在开会" << endl; }
};// 一个函数,接收任何 Employee* 类型的指针
void analyzeEmployee(Employee* emp) {// 使用 typeid 判断 emp 实际指向的对象类型if (typeid(*emp) == typeid(Engineer)) {cout << "分析结果:这是一个工程师" << endl;} else if (typeid(*emp) == typeid(Manager)) {cout << "分析结果:这是一个经理" << endl;} else {cout << "分析结果:未知员工类型" << endl;}
}int main() {Engineer eng;Manager mgr;Employee* ptr1 = ŋ // 基类指针指向 EngineerEmployee* ptr2 = &mgr; // 基类指针指向 ManageranalyzeEmployee(ptr1); // 输出:这是一个工程师analyze_employee(ptr2); // 输出:这是一个经理return 0;
}
2.2、模版函数中使用
template<typename T>static bool GetValue(rapidjson::Value& doc, const char* key, T& value){assert(doc.IsObject());if (!doc.HasMember(key)){return false;}const rapidjson::Value& memberValue = doc[key];if (typeid(bool) == typeid(T) && memberValue.IsBool()){value = (T)memberValue.GetBool();return true;}else if (typeid(int) == typeid(T) && memberValue.IsInt()){value = (T)memberValue.GetInt();return true;}else if (typeid(unsigned) == typeid(T) && memberValue.IsUint()){value = (T)memberValue.GetUint();return true;}else if (typeid(int64_t) == typeid(T) && memberValue.IsInt64()){value = (T)memberValue.GetInt64();return true;}else if (typeid(uint64_t) == typeid(T) && memberValue.IsUint64()){value = (T)memberValue.GetUint64();return true;}else if (typeid(double) == typeid(T) && memberValue.IsDouble()){value = (T)memberValue.GetDouble();return true;}else if (typeid(float) == typeid(T) && memberValue.IsFloat()){value = (T)memberValue.GetFloat();return true;}else{assert("Invalid template type or memberValue type!");}return false;}
学习链接:https://github.com/0voice