c++ - 向 C++ 枚举添加值

标签 c++ c++11 enums

假设我在另一个我无法更改的库中有以下代码:

typedef enum {
    p0  = 0,
    p1  = 1,
    p2  = 2,
    p3  = 3,
    p4  = 4,
    p5  = 5,
    p6  = 6,
    ...
} PinName;

我想像这样添加一些额外的别名(不使用 const PinName PIN_...):

enum class : PinName {
    PIN_SD_MOSI = p0,
    PIN_SD_MISO = p4,
    PIN_SD_SCK = p2,
    PIN_SD_CSN = p6,
};

但它不起作用。我收到以下错误:

error: underlying type 'PinName' of '<anonymous enum class>' must be an integral type
  enum class : PinName {
               ^

我也尝试过使用 enum class : int { 但是别名永远不会在范围内 - 我怀疑我必须改用普通的 enumenum : int 编译,但您不能将任何别名传递给采用 PinName 的函数。你得到这个错误:

error: no matching function for call to 'foo(<anonymous enum>, <anonymous enum>)'
 foo(PIN_SD_MISO, PIN_SD_MOSI);
     ^

(候选人是 foo(PinName, PinName)。)

在我放弃并使用 const PinName PIN_SD_MISO = p2; 之前,有没有人知道一个好的解决方案?

最佳答案

有点hacky,但这是我在处理作用域枚举时想到的:

enum class OriginalType {
   FOO,  // 0
   BAR   // 1
   END   // 2
};

enum class ExtendOriginalType : std::underlying_type_t<OriginalType> {
   EXTENDED_FOO = static_cast<std::underlying_type_t<OriginalType>>
                                           (OriginalType::END), // 2
   EXTENDED_BAR  // 3
};

然后像这样使用:

OriginalType myOriginalType = (OriginalType)ExtendOriginalType::EXTENDED_BAR;

来自 Base enum class inheritance

关于c++ - 向 C++ 枚举添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34336086/

相关文章:

c++ - 假栈比真栈快吗

c++ - 如何更好地检查两个 char 变量是否在某些值集中?

c++ - 模板类的typedef

c++ - 使用 'new' 和指针理解 C++ 代码

c++ - 初始化程序列表不适用于 Visual Studio 2012 中的 vector ?

c++ - 动态数组双重释放或损坏

c++ - 模板类中的尾随返回类型(GNU 和 Microsoft 编译器之间的矛盾)

mysql - Cakehph3 : How can we validate enum type Mysql field in cakephp?

java - 如何更改枚举的 IntelliJ 重新格式化代码样式?

c - 错误 : field has incomplete type in C