[英]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.