2016-03-31 1 views
0

enum classをオンにすると、すべての場合にenum classを再入力する必要があります。 constexprの外にあるので、このバグは私が他に何を意味するのか想像するのは難しいです。コンパイラにブロック内のすべてが一致するものがあれば私の選択したenum classに解決されるべきであることを通知することはありませんか?enumクラスを切り替えるときに繰り返しを削除します

コンパイルスニペットを含む次の例を考えてみましょう。またコンパイルのために、コンパイルしないスニペット(コメントアウト)を記述したいと思います。

#include <iostream> 

enum class State : std::uint8_t; 
void writeline(const char * msg); 
void Compiles(State some); 

enum class State : std::uint8_t 
{ 
    zero = 0, 
    one = 1 
}; 

int main() 
{ 
    Compiles(State::zero); 
    return 0; 
} 

void Compiles(State some) 
{ 
    switch (some) 
    { 
    case State::zero: //State:: 
     writeline("0"); 
     break; 
    case State::one: //State:: 
     writeline("1"); 
     break; 
    default: 
     writeline("d"); 
     break; 
    } 
} 


//void WhatIWant(State some) 
//{ 
// using State{ //this makes no sense to the compiler but it expresses what I want to write 
//  switch (some) 
//  { 
//  case zero: //I want the compiler to figure out State::zero 
//   writeline("0"); 
//   break; 
//  case one: //I want the compiler to figure out State::one 
//   writeline("1"); 
//   break; 
//  default: 
//   writeline("d"); 
//   break; 
//  } 
// } 
//} 

void writeline(const char * msg) 
{ 
    std::cout << msg << std::endl; 
} 

多分一度ヒントを与えた後、enum classからコンパイラフィギュアをswitchステートメントを使用して持っている方法はありますか?

+0

古いスタイル(非クラス)の列挙型を使用しない限り、私はあなたが望むとは思えません。 enumクラスの利点の1つは、すべてのenum値に対して完全修飾名を使用して名前の競合を避けることです。 –

+0

最近、誰かがこれについて最近提案しました。それは拒絶された。 –

+0

@ T.C。その提案をどこで見つけることができますか? – Johannes

答えて

1

enum classあなたはにはが必要です。毎回State::を入力してください。

すべての文で接頭辞State::を使用しない場合は、C++ 98の旧式の列挙型を使用してください。

注:定期的に列挙型でenum MyEnym: std::uint8_t{ ... }:C++ 11であなたはまだのようななめらかを使用することができます。

関連する問題