使用带有普通旧结构(gcc)的RTTI
Using RTTI with plain old structures (gcc)
我需要将某种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
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 使用带有普通旧结构(gcc)的RTTI
- 从 GCC 可执行文件中删除符号和 RTTI 文本
- 编译时类型没有RTTI与GCC
- 如何从指针中知道 gcc 的 c++ 对象的 RTTI 信息"this"?
- Visual Studio 如何将 boost::function 与 /GR- 一起使用,而 GCC 不能使用 -fno-rtti?