簡體   English   中英

如何在C ++中為枚舉指定無符號整數?

[英]How can I assign an unsigned integer to an enum in C++?

在我正在重寫的內部的C ++庫中,我有一些無符號整數變量,我想將其轉換為枚舉:

enum InitType {
    INIT,
    NON_INIT
};

我有一個這種類型的變量:

InitType InitVar;

該庫是從其變量為普通整數的代碼的另一部分調用的:

uint32_t UnsignedIntVar;

我想將從調用者傳遞的無符號版本分配給庫內部枚舉:

InitVar = UnsignedIntVar;

但編譯器不喜歡這樣:

error: invalid conversion from 'uint32_t' to 'InitType'

執行此轉換的最簡潔方法是什么?


以下是我的一些想法:

如果enum只有兩個值,我可以這樣做:

    InitVar = UnsignedIntVar ? Init : NonInit;

這是我想做這樣一個任務的時候寫的很多東西。

如果它有更多值,我可以創建一個轉換表:

InitType Uint2InitTypeConv = {INIT_0, INIT_1, INIT_2...};

其中INIT_x只是枚舉的名稱。 然后我可以使用表格進行翻譯:

InitVar = Uint2InitTypeConv[UnsignedIntVar];

這看起來很干凈。 但是,我認為我應該能夠為此重載operator= ,但我似乎無法做到這一點。 這很容易包含我能提出的任何其他丑陋。

您可以顯式轉換為枚舉:

InitType i = InitType(UnsignedIntvar);

如果整數沒有與已知枚舉值對應的值,那么這就是您的問題。

這是完全可以接受的典型情況是循環枚舉:

enum ESomething { Default = 0, Something, SomeOtherThing };
for (int i = 0; i != 3; ++i)
{
  ESomething e = ESomething(i);
  // do something with "e"
}
InitVar = UnsignedIntVar ? Init : NonInit;

這是我想做這樣一個任務的時候寫的很多東西。

是的,但由於uint32_t含義與你的enum含義不同,我還是會這樣做。 正如他們在Python社區中所說的那樣,“顯性優於隱性”。 我不會進行演員表,並且表格方法的缺點是您必須枚舉所有uint32_t值以獲得完全覆蓋,這實際上是不可能的。

為什么不引入具有適當名稱的函數來進行轉換? InitType init_type(uint32_t)這樣的東西,實現為一個switch

暫無
暫無

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

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