如何在 C++ 中跨模块存储枚举类型/存储类型信息

问题描述

我正在开发一个包含 ECS 的游戏引擎。我有一个非常简单的设置 - 我的引擎在一个 DLL 中,我的游戏模块是附加 DLL 的 .EXE。我使用密集的内存块分配创建了一个 ECS,我非常关注性能。对于 ECS 的基础,我使用类型信息结构来枚举不同的实体组件类型。我基本上使用指向模板化函数函数指针作为枚举不同类型的一种方式。其定义如下:

struct ComponentTypeInfo
{
     typedef (*_InternalId)();
     
     _InternalId TypeId;
     size_t TypeSize;
protected:
     template<typename>
     static void TypeId() {}
}
template<typename TComponent>
struct GetComponentTypeInfo : public ComponentTypeInfo
{
     GetComponentTypeInfo() : ComponentTypeInfo(TypeId<TComponent>,sizeof(TComponent))
}

问题:在实践中这很好用,但是由于函数实例是分开的,当跨模块比较类型时它会中断。这会导致函数指针不同,因此 Id 也不同。我尝试了很多方法,但它们都遇到了关于模块边界的相同问题。

我目前想到的:

  1. 确保只有一个模块使用类型信息 - 这实际上是不可能的,因为引擎有自己预定义的组件类型以在系统中使用。
  2. 使用计数器/增量样式的 id - 仍然遇到同样的问题 - 任何将 id 附加到类型的方式都会遇到模板化功能总是在其自己的模块中实例化的问题,因此 id 永远不会匹配。
  3. 使用继承 - 由于 ECS 使用密集打包的内存块,类型擦除很早就发生了,并且使用内存块和堆栈的逻辑没有存储类型的编译时信息。只是类型 ID。
  4. 我想远离 STL,除非我绝对需要使用它。但是,如果没有其他工作,我最终可能会在它周围使用包装器。不考虑库(增强等)。

是否有任何合理的方法可以跨模块枚举类型? RTTI 仅对 STL 可用吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)