[英]How to cast int to enum in C++?
如何將 int 轉換為 C++ 中的枚舉?
例如:
enum Test
{
A, B
};
int a = 1;
如何將a
轉換為類型Test::A
?
int i = 1;
Test val = static_cast<Test>(i);
Test e = static_cast<Test>(1);
你的代碼
enum Test
{
A, B
}
int a = 1;
解決方案
Test castEnum = static_cast<Test>(a);
分拆結束的問題,“我如何將 a 轉換為類型Test::A
”,而不是嚴格要求在那里有一個演員,並且遲到幾年才回答,因為這似乎是一個受歡迎的問題,沒有其他人根據 C++11 標准提到了替代方案:
5.2.9 靜態轉換
... 如果聲明
T t(e);
則表達式e
可以使用static_cast
static_cast<T>(e)
形式的 static_cast 顯式轉換為類型T
; 對於一些發明的臨時變量t
(8.5) 是良構的。 這種顯式轉換的效果與執行聲明和初始化,然后使用臨時變量作為轉換的結果相同。
因此,直接使用t(e)
形式也可以,您可能更喜歡它的簡潔性:
auto result = Test(a);
Test castEnum = static_cast<Test>(a-1);
將a
投射到A
。 如果您不想子結構 1,您可以重新定義enum
:
enum Test
{
A:1, B
};
在這種情況下Test castEnum = static_cast<Test>(a);
可用於將a
強制轉換為A
。
順便提一下,如果enum
的底層類型恰好是固定的,從 C++17 開始,可以簡單地寫
enum Test : int {A, B};
int a = 1;
Test val{a};
當然還有Test val{1};
也是有效的。
相關的cppreference部分內容如下(強調我的):
如果滿足以下所有條件,則可以使用列表初始化從不進行強制轉換的整數初始化枚舉:
- 初始化是直接列表初始化
- 初始化列表只有一個元素
- 枚舉是作用域的或非作用域的,基礎類型是固定的
- 轉換是非縮小的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.