c++ - 将 union 枚举传递到 C++ 中的函数中

标签 c++

我正在协助一个反编译视频游戏的项目。

游戏有设置事件摄像机的功能:

SetActiveCam(LevelIds level, int16_t cam)

“LevelIds”只是一个具有 int16_t 值的枚举类(从 0 到 15 的完整集合)。

我想对摄像头 ID 执行类似的操作:

SetActiveCam(LevelIds level, CameraIds cam)

但是,凸轮 ID 值与上下文相关,具体取决于级别。

例如,CamID #2 可能是“菜单”级别中的选项菜单,但完全是“森林”级别中的其他内容。

下面我创建了一个 CameraIds union ,其中包含枚举中命名的所有“菜单”摄像头:

union CameraIds
{
    enum class Menu : int16_t
    {
        eMainMenu_1 = 1,
        eOptions_2 = 2,
        eGamespeakGamepad_3 = 3,
        eMotions_4 = 4,
        eSound_5 = 5,
        eLoad_6 = 6,
        eMotionsGamespeakGamepad_7 = 7,
        eCopyright_10 = 10,
        eLoading_21 = 21,
        eFmvSelect_30 = 30,
        eLvlSelect_31 = 31,
        eGamespeakKeyboard_33 = 33,
        eMotionsGamespeakKeyboard_37 = 37,
        eController_40 = 40,
        eControllerConfig_41 = 41
    } menu;

    enum class Forest : int16_t
    {
        eForestStart_1 = 1,
        eForestSecretScreen_23 = 23
    } forest;

    int16_t raw;
};

但是,下面的函数调用...

SetActiveCam(LevelIds::eMenu_0, CameraIds::Menu::eOptions_2);

导致以下错误消息:

No suitable constructor exists to convert from "CameraIds::Menu" to "CameraIds"

有什么想法吗?

这个想法是通过为其中一些相机 ID 提供适当的名称来减少魔数(Magic Number)。

“CameraIds::LEVEL::SCREEN”格式是我非常喜欢的一种格式 - 但我在使其工作时遇到了麻烦...

我是否遗漏了一些明显的东西?选角可能是这样……但这是好的做法吗?

编辑:添加了另一个枚举以减轻一些困惑。

最佳答案

您只想传递枚举,但您的参数类型是整个 union 。您需要将第二个参数类型从 CameraIDs 更改为 CameraIDs::Menu。

关于c++ - 将 union 枚举传递到 C++ 中的函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67616251/

相关文章:

c++ - 升压::变体;定义访客类别

c# - 如何通过编程生成exe程序?

c++ - POSIX 条件变量和互斥量 "competition"

c++ - 用于创建唯一命名的 OpenMP 临界区的宏?

c++ - 无法在守护进程中打开 ttyUSB 端口

c++ - 在 IDE 外运行 .exe 但在 IDE 内使用断点

c++ - 什么是 "metadata operation failed"VS2008 链接器错误?

c++ - 我在哪里可以找到 GCC 源代码中 strncpy() 函数的实现?

c++ - win32 编程 C++

python - 如何使用嵌入式 python 解释器构建和执行 cpp 文件(pybind11)