微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 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 举报,一经查实,本站将立刻删除。