C++0xでは、scoped enumが追加されている。従来のenumは、unscoped enumと呼ばれている。いやしくもC++0xプログラマならば、scoped enumを使うべきである。
一体、従来のenumと、何が違うのか。scoped enumは、強い型付けによって、バグを防いでくれる。
使い方は、とても簡単である。
// scoped enum enum struct Hairstyle { FusaFusa, Mohawk, Hage } ; int main() { // OK Hairstyle style = Hairstyle::FusaFusa ; // Error: enum名が指定されていない。 Hairstyle head = Hage ; // Error: 暗黙の型変換はできない。 int i = Hairstyle::Hage ; // OK: 明示的にキャストするのは可。 int BigWave = static_cast<int>(Hairstyle::Mohawk) ; }
これによって、C++0xプログラマは、enumが暗黙に変換されることによるバグを見つける能力を失う。そもそも、そんなバグは、C++0xでは、起こりようがないのだ、したがって、そんな非人間的なデバッグ能力も、必要ない。C++0xでは、scoped enumを使うべきである。
ところで、C++0xでは、enum型の内部的な型を指定できる。
enum struct Int : int { value } ; enum struct UInt : unsigned int { value } ;
また、その内部的な型を取得するメタ関数も定義されている。
int main() { std::underlying_type<Int>::type x ;// int std::underlying_type<UInt>::type y ;// unsigned int }
この、内部的な型を指定出来る機能というのも、重要だ。環境依存の話になるが、たとえば、DirectXのSDKのヘッダなどでは、定数の宣言に、enumを用いているが、enumの内部的な型がDWORDであることを保証させるため、以下のようなテクニックが用いられている。
enum { ID1 = 1, ID2 = 2, dummy = 0xffffffff }
こんな汚いコードは、今後、書く必要がなくなる。
No comments:
Post a Comment