在运行时创建枚举或标识符(可能来自JSON)

时间:2017-02-22 11:58:16

标签: c++ json enums identifier

我不确定在这里如何最好地表达我的问题。

作为大学任务的一部分,我需要制作一个对客户端代码库影响最小的通用游戏组件。我正在做一个任务管理系统,它在很大程度上依赖于系统可以使用的类型定义(任务/任务/事件类型)。为了给出一些重要的背景信息,客户还需要定义这些类型的链接方式(即什么事件解锁任务,哪些任务构成任务等)。

我的困境是性能和可用性之一。通常使用enum来解析类型标识符,但是我不能指望客户端代码中存在这个(可能很大的)定义列表,更不用说需要指定的其他数据了。

我的第一个想法是将这些类型定义为外部JSON文件中的字符串,但除了enum引发的额外性能影响之外,这意味着客户端开发人员还必须验证string他们写的类型与他们定义的类型相匹配。使用enum时,可以显示它们的列表,如下图所示,这使开发人员确信该类型确实存在。

Enum advantage

我的初始解决方案是在JSON文件中包含字符串类型和数据,并使用宏函数,将标识符填充到具有integer值的命名空间(即模仿enums)并对标识符进行字符串化以使其符号化可以与JSON数据链接。

// Creating identifier and stringifying it
#define ADD_QUEST(identifier) namespace QUEST_TYPES { int identifier = nextNumber(#identifier, 0); }

// Creating the quest identifiers
ADD_QUEST(COLLECT_10_COINS)
ADD_QUEST(SAVE_PRINCESS)

// Using the identifiers
questMgr.createQuest(QUEST_TYPES::SAVE_PRINCESS);

这个解决方案实际上是在上图中显示的内容,但它忽略了“最小化对客户端代码库的影响”的上述规则。因此,我的讲师拒绝了。

所以我想我的问题是,有没有办法在运行时填充枚举/标识符(可能来自但不限于JSON)或者我是否仍然使用字符串类型标识符来处理所有类型?

0 个答案:

没有答案