2010-03-20

scoped enumについて

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: