You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在宏内声明枚举值?——ECS架构下的功能注册需求

前置说明:本问题难度较高,无需勉强直接作答,若有更优设计方案,欢迎提出。

需求背景

我们正在开发一款高可修改性软件,采用ECS(实体组件系统)设计模式并遵循开闭原则,核心需求如下:

  • 对象持有FeatureList(功能列表),这是位域结构,每个位对应一个Component(组件),符合ECS规范。
  • 新增Feature(功能)时无需在程序中#include相关代码,提升开发友好性与可修改性。
  • Feature禁止使用硬编码值,便于快速禁用、修改与重构功能。

目前已有可行实现,经测试代码可正常运行。

现存问题

我们面临的核心设计问题是硬编码功能值的使用:

ExampleObject->FeatureList |= (1 << 0); // Spawn Feature1
ExampleObject->FeatureList |= (1 << 1); // Spawn Feature2
ExampleObject->FeatureList |= (1 << 2); // Spawn Feature3

这种写法违反第三条需求,且值依赖编译顺序,并非理想方案。

我们尝试过通过注册表查找的方案修复,示例代码如下:

ExampleObject->FeatureList |= (1 << FeatureRegistry::GetInstance().GetFeatureValue("Feature1"));
ExampleObject->FeatureList |= (1 << FeatureRegistry::GetInstance().GetFeatureValue("Feature2"));
ExampleObject->FeatureList |= (1 << FeatureRegistry::GetInstance().GetFeatureValue("Feature3"));

但该方案需要硬编码字符串:若Feature名称变更或移除,无法快速批量替换或禁用功能生成(仅能依赖编译器报错,体验不佳)。

枚举值可以实现名称-整数的无硬编码映射,且多数IDE支持自动补全,操作更便捷。因此我们需要为每个已注册Feature定义对应值的枚举类型。

看似只需在REGISTER_FEATURE宏中添加枚举值,但实现路径不清晰:目前没有动态分配枚举或多文件共享宏内声明枚举的相关资料;不透明与匿名枚举的利用方式也不明确。

最终问题

如何在宏内声明枚举值?


内容的提问来源于stack exchange,提问作者ingotangjingle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:45:29