【问题标题】:Adding values to a C++ enum向 C++ 枚举添加值
【发布时间】:2015-12-17 13:42:48
【问题描述】:

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

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;之前,有没有人知道一个好的解决方案?

【问题讨论】:

标签: c++ c++11 enums


【解决方案1】:

有点老套,但这是我在处理范围枚举时想出的:

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
};

然后使用like:

OriginalType myOriginalType = (OriginalType)ExtendOriginalType::EXTENDED_BAR;

来自Base enum class inheritance

【讨论】:

  • OriginalType 不是enum class
  • 我不明白你的意思。详细点?
  • 在我的问题中PinNameenum,而不是enum class,我无法更改它。
【解决方案2】:

我会为此被击落,但为什么不直接使用宏呢?

#define PIN_SD_MOSI  p0
#define PIN_SD_MISO  p4
#define PIN_SD_SCK   p2
#define PIN_SD_CSN   p6

【讨论】:

  • 我确实支持了你,但实际上,重新阅读我的问题我确实已经提到了这种可能性(但使用 const PinName PIN_SDMOSI = p2; 这是一个更好的解决方案)。
  • @Timmmm:为什么它是一个更好的解决方案?毕竟,宏更简单。
  • 它的类型和命名空间都正确。
猜你喜欢
  • 2020-12-24
  • 2013-10-14
  • 2015-03-24
  • 2020-05-11
  • 1970-01-01
  • 2011-08-17
  • 2015-02-24
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多