2
我用這樣的函數轉換int
(從傳統的API)向enum
:generic int - >使用模板的枚舉轉換可能嗎?
TestEnum to_test_enum(int value) {
TestEnum converted(static_cast<TestEnum>(value));
# pragma GCC diagnostic push
# pragma GCC diagnostic error "-Wswitch"
switch (converted) {
case TestEnum::A:
case TestEnum::B:
return converted;
}
# pragma GCC diagnostic pop
throw std::runtime_error("wrong value");
}
to_test_enum
將引發一個無效值已經傳給to_enum
異常,否則返回根據TestEnum
值。 pragma
可確保在缺少合法值的情況下我將收到編譯器錯誤。
線,如這些現在將轉換爲整數,並做了有效性檢查在運行時:
enum class TestEnum {
A = 1,
B = 2,
};
auto v1 = to_test_enum(2);
auto v2 = to_test_enum(3); // will throw
問題:我不知道是否有可能以某種模板魔法變成一個函數模板:
template<class E>
E to_enum(int value) {
E converted(static_cast<E>(value));
switch (converted) {
EACH ELEMENT e IN E: case e: <--- here goes some unrolling magic
return converted;
}
throw std::runtime_error("wrong value");
}
該函數將被用於這樣的:
auto v1 = to_enum<TestEnum>(2);
auto v2 = to_enum<TestEnum>(3); // will throw
不,(除非你做了一些欺騙性的東西來聲明枚舉與一些內省)。 – Jarod42
如果添加First和Last或其他佔位符元素來表示可能的範圍,那麼這可能是可能的,但是這會強制枚舉值覆蓋順序範圍的值而沒有任何漏洞,不確定是否要這樣做。 –
我發現了一些有用的預處理器,它可以從同一個文本文件中創建幾個相關的C++東西(例如,創建一個映射枚舉 - > enumNameString,定義enumType_first和enumType_last,並可能定義一個內聯轉換函數)。 –