More C++ Idioms/Type Safe Enum

From Wikibooks, the open-content textbooks collection

Jump to: navigation, search

Contents

[edit] Intent

[edit] Also Known As

[edit] Motivation

[edit] Solution and Sample Code

template<typename def, typename inner = typename def::type>
struct right_enum : def
{
    typedef typename def::type type;
    inner v;
    right_enum(type v) : v(static_cast<type>(v)) {}
    operator inner () const {return v;}
};

Example:

struct color_def
{
    enum type
    {
        red, green, blue
    };
};
 
typedef right_enum<color_def> color; // use int as enum holder data type (in common platforms)
typedef right_enum<color_def, unsigned char> color; // use uchar as enum holder
 
// usage:
void f(color p)
{
    p = color::green;
}
 
int main()
{
    color p = color::red;
    f(p);
}

[edit] Known Uses

[edit] Related Idioms

[edit] References

Strongly-typed enums in C++0x.