C++ 将联合枚举传递到c++;

C++ 将联合枚举传递到c++;,c++,C++,我正在帮助一个反编译视频游戏的项目 游戏具有设置活动摄像机的功能: SetActiveCam(LevelIds level, int16_t cam) “LevelIds”只是一个具有int16_t值(从0到15的完整集合)的枚举类 我想对cam ID执行类似的操作: SetActiveCam(LevelIds level, CameraIds cam) 但是,cam ID值是上下文敏感的,取决于级别 例如,CamID#2可能是“Menu”级别中的OptionsMenu,但完全是“Fores

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

游戏具有设置活动摄像机的功能:

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

我想对cam ID执行类似的操作:

SetActiveCam(LevelIds level, CameraIds cam)
但是,cam ID值是上下文敏感的,取决于级别

例如,CamID#2可能是“Menu”级别中的OptionsMenu,但完全是“Forest”级别中的其他内容

在下面,我创建了一个CameraIds联合,其中包含枚举中命名的所有“菜单”凸轮:

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);
导致以下错误消息:

没有合适的构造函数将“CameraIds::Menu”转换为“CameraIds”

有什么想法吗

这个想法是通过给一些摄像机ID取适当的名字来减少魔法数字

“CameraIds::LEVEL::SCREEN”格式是我非常喜欢的格式,但我很难让它正常工作

我有什么明显的遗漏吗?也许是吧。。。但这是好的做法吗


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

您希望只传递枚举,但您的参数类型是“整联合”。您需要将第二个参数类型从CameraIDs更改为CameraIDs::Menu。

我建议另一种设计。由于级别基本上是由摄影机id的类型编码的,那么一组使用基于参数的级别id的重载如何:

void SetActiveCam(MenuCameraIds cam) {
    SetActiveCam(LevelIds::eMenu_0, cam);
}
void SetActiveCam(ForestCamera cam) {
    SetActiveCam(LevelIds::eForest_0, cam);
}

我希望第二个参数类型是灵活的。CameraIds::Menu、CameraIds::Forest等或原始int16_t值。我添加了另一个枚举以帮助更好地说明这一点。我不确定为什么不简单地定义常量int16_t值,可能是在命名空间中?不需要进行联合类型双关。使用C++11,您还可以说
enumcomeraid:int16{eMainMenu_1=1,eOptions_2=2/*…*/},指定基础类型(我想这就是您的目标)。带有常量的命名空间是一个公平的建议。我主要考虑的是匹配现有LevelIds实现的enum解决方案。但如果不能做到这一点,下面可能是最好的折衷办法:
namespace CameraIds{namespace Menu{const int16_t eMainMenu_1=1;}}
干杯。