c++上的枚举中的枚举

Enum inside enum on C++

本文关键字:枚举 c++      更新时间:2023-10-16

我正试图获得基于常量的工作结构。我有ObjectTypes (KEYBOARD, MOUSE, HAPTIC…),可以有InputTypes(鼠标可以是DEFAULT和INVERSE,而键盘可以是DEFAULT和NUMERIC, HAPTIC只能是DEFAULT)。

为了得到这个工作,我试图在c++中称为Constants的类中使用枚举中的枚举。它可以将ObjectTypes参数和InputTypes参数传递给函数,所以我需要在原型中这样做:

changeInputSystem(SimulatorConstants::InputObject input, SimulatorConstants::InputTypes type)

但是在c++中,当我声明一个枚举时,从this(内部)取出的每个值,其中一些替换其他值。

我的代码现在(不工作)是:

    enum InputObject {
        KEYBOARD,
    MOUSE,
    HAPTIC
};
enum InputTypes {
    enum KeyboardTypes {
        DEFAULT
    };
    enum MouseTypes {
        DEFAULT,
        INVERSE
    };
    enum HapticTypes {
        DEFAULT
    };
};

注意:我知道枚举之间没有继承,所以我需要任何可以以类似方式工作的解决方案。谢谢。

如果你做的是面向对象的,它就会工作。所以不用所有元素都有枚举,只要有类:

class InputObject {};
class Mouse : public InputObject
{
  void setDefault();
  void setInverse();
};

这样InputObject的类型就可以保存在对象内部,你只需要传递实际的InputObject。

就像在注释中写的那样,如果您可以访问c++ 11编译器,最好使用enum类,它会将您自己接受的答案(在撰写本文时)代码更改为:

enum class KeyboardTypes {
   DEFAULT
};
enum class MouseTypes {
  DEFAULT,
   INVERSE
};
enum class HapticTypes {
   DEFAULT
};

当然,您的重载函数可以更改为更自然的版本:

void changeInputSystem(SimulatorConstants::MouseTypes type);
void changeInputSystem(SimulatorConstants::KeyboardTypes type);
void changeInputSystem(SimulatorConstants::HapticTypes type);

并且,作为奖励,将不会从枚举隐式强制转换为整数值。

好的,做了一些证明,我终于用过载解决了这个问题。通过重载方法和创建三个不同的结构体,我删除了ObjectTypes:

struct KeyboardTypes {
   enum types{
      DEFAULT
   };
};
struct MouseTypes {
   enum types{
      DEFAULT,
      INVERSE
   };
};
struct HapticTypes {
   enum types{
      DEFAULT
   };
};

和重载成员函数:

void changeInputSystem(SimulatorConstants::MouseTypes::types type);
void changeInputSystem(SimulatorConstants::KeyboardTypes::types type);
void changeInputSystem(SimulatorConstants::HapticTypes::types type);

感谢所有帮助过我的人。