使用带有普通旧结构(gcc)的RTTI

Using RTTI with plain old structures (gcc)

本文关键字:gcc RTTI 结构      更新时间:2023-10-16

我需要将某种RTTI信息"附加"到外部(不可修改)结构。

正如我从gcc实现中看到的那样,具有虚拟方法的struct在其开头另外有一个指向与type_info相关的结构的指针。

因此,我需要通过使用同时包含两部分的双指针来操作这些外部结构:数据指针和"类型"指针。该双指针具有"正常"RTTI结构的所有信息。你知道有什么"合法"或黑客的方法吗

为此创建一个智能指针类:

#include <typeindex>
#include <type_traits>
// minimal implementation
template<typename T>
class RTTIPointer
{
    T* ptr_;
    std::type_index type_;
public:
    template<typename U, typename std::enable_if<std::is_convertible<U*, T*>::value>::type* = nullptr>
    RTTIPointer(U* p) :
        ptr_(p),
        type_(typeid(*p))
    {
    }
    // typename std::add_lvalue_reference<T>::type instead of T&
    // to support void pointers
    typename std::add_lvalue_reference<T>::type operator*() const
    {
        return *ptr_;
    }
    T* operator->() const
    {
        return ptr_;
    }
    T* get() const
    {
        return ptr_;
    }
    std::type_index type() const
    {
        return type_;
    }
};
struct Base { int a; };
struct Derived : Base { int b; };
#include <iostream>
int main()
{
    Derived b;
    b.a = 2;
    b.b = 3;
    RTTIPointer<Base> r(&b);
    std::cout << r->a << "n" << r.type().name() << "n";
    RTTIPointer<void> q(&b);
    std::cout << r.type().name() << "n";
}

输出:

2
7Derived
7Derived