2017-04-09 60 views
-1

我有段:進樣值到枚舉

enum class EnumClass { 
}; 

constexpr EnumClass m0 = static_cast<EnumClass>(0); 
constexpr EnumClass m1 = static_cast<EnumClass>(1); 

int main() 
{ 
    EnumClass aa = m0; 
    switch (aa) { 
     case m0 : break; 
     case m1 : break; 
    } 
} 

的gcc 7.0 -Wall標誌合理警告我:

warning: case value '0' not in enumerated type 'EnumClass' [-Wswitch] 
warning: case value '1' not in enumerated type 'EnumClass' [-Wswitch] 

我想要的是擺脫這一警告的。假設有很多這樣的交換機,所以每次手動關閉/打開此警告都不太方便。此外,我不想在全球範圍內關閉此診斷。

我想要的是以某種方式說(可能在EnumClass定義中有一些宏)給編譯器,任何可能的int值都可以在EnumClass中。有人可以提出一些想法如何實現?

+2

如果你希望映射到每個可能的int值,那麼使用enum有什麼意義? –

+0

我正在爲私人用途寫一個智能枚舉的小型圖書館。我沒有真正使用這樣的枚舉,就像我在這段代碼中寫的那樣。這是這個問題的簡單例子。 –

回答

0

我還是不明白,你的最終目標是什麼,但是,假設你要防止發生只在你的代碼的某些特定部分,你可以使用#pragma指令如下-Wswitch警告:

int main() 
{ 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wswitch" 
    EnumClass aa = EnumClass::m0; 
    switch (aa) { 
     case EnumClass::m0 : break;  
     case EnumClass::m1 : break;  
     case static_cast<EnumClass>(888) : break; 
    } 
#pragma GCC diagnostic pop 
} 

live wandbox example

這不會禁用-Wswitch全球 - 它將在#pragma GCC diagnostic pop行恢復。

+0

不是,這太冗長了,無法在每個開關/外殼中手動關閉診斷。我更新了這個問題。也許設計會更清晰。 –

+0

@SeleznevAnton:這不是 - 你對'enum class'的使用是非常規和錯誤的。你想要一個「強大的typedef」,而不是? –

+0

我會看看「強烈的typedefs」討論。也許他們會適合我。謝謝。 –