Skip to content

败犬日报 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;
}