簡體   English   中英

向 C++ 枚舉添加值

[英]Adding values to a C++ enum

假設我在另一個我無法更改的庫中有以下代碼:

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 {但別名永遠不會在 scope 中 - 我懷疑我必須改用普通enum enum: 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;

來自基本枚舉 class inheritance

我會因此被擊落,但為什么不直接使用宏呢?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM