Similar to integer type classes a template is used to build up the required type classes automatically (see Figure 5.4).
template<class R> class enum_type : public enum_base {
...
};
R denotes the corresponding enumeration type info
class. Note, only static methods defined in the class are executed
within the template class.
Example:
template<class R> class enum_type : public enum_base {
public:
// Note, ``R'' is the type info class of the enumeration type and
// R::low() is a static method which returns the low bound
// of the enumeration type. Usually, this bound is 0. However,
// if the current enumeration type is a subtype of another
// enumeration type, then the values are taken from these
// type.
enum_type(const int a=R::low()) : enum_base(a) { };
enum_type &operator=(const int a) { value = a; }
enum_type &operator=(const enum_type a) { ... }
enum_type &operator=(const enum_base a) { ... }
/* Compare operators */
int &operator<(const enum_type a);
int &operator>(const enum_type a);
...
};