败犬日报 2025-04-28
1. 手动实现 typeid
手动实现 typeid 主要为了替代 RTTI(因为 RTTI 有二进制膨胀问题,部分项目会禁止)。
typeid 一般可以用静态局部变量取地址实现。
cpp
template <typename T>
void* gettypeid() {
static int x;
return &x;
}
在此基础上可以用虚函数 + CRTP 来完成动态获取 typeid。
cpp
#include <cstdint>
#include <iostream>
template <typename T>
void* gettypeid() {
static int x;
return &x;
}
struct Base {
virtual void* gettypeid() const = 0;
virtual ~Base() = default;
};
template <typename Derived>
struct EnableGetTypeId : Base {
void* gettypeid() const override { return ::gettypeid<Derived>(); }
};
struct Derived1 : EnableGetTypeId<Derived1> {};
struct Derived2 : EnableGetTypeId<Derived2> {};
int main() {
Derived1 d1;
Derived2 d2;
Base* p1 = &d1;
Base* p2 = &d2;
std::cout << "Derived1 type_id: " << gettypeid<Derived1>() << std::endl;
std::cout << "Derived1 dynamic type_id: " << p1->gettypeid() << std::endl;
std::cout << "Derived2 type_id: " << gettypeid<Derived2>() << std::endl;
std::cout << "Derived2 dynamic type_id: " << p2->gettypeid() << std::endl;
}