/*! @file @brief そこそこ型安全な列挙型のようなもの まあ何となく思いついたものだから本当に使えるかどうかは知らん。 使い方はソースの下の方を見ろ。 @author Juna */ #ifndef Juna_Type_Safe_Enumeration_Hpp #define Juna_Type_Safe_Enumeration_Hpp //! namespace Juna namespace Juna { //! 列挙型のようなものクラステンプレート /*! そこそこ型安全な列挙型のようなものクラステンプレート @param Tag 異なるEnumerationクラスを区別するための型 @param Integer 列挙子の値を格納する変数の型(整数値型(enumで表現できる)) */ template class Enumeration { public: //! 列挙子のようなものクラステンプレート /*! そこそこ型安全な列挙型のようなものの列挙子のようなものクラステンプレート @param i 列挙子の値となる、Integer型の整数値 */ template struct Enumerator {enum {value = i};}; //! 列挙子による初期化 template Enumeration(Enumerator) : value(i) {} // explicit Enumeration(Value) : value(i) {} //! @name 比較 //@{ bool operator==(const Enumeration rhs) const {return value == rhs.value;} bool operator!=(const Enumeration rhs) const {return value != rhs.value;} //@} //! 保持している列挙子の値 Integer Value(void) const {return value;} private: Integer value; }; }//namespace Juna #endif /* 例 //直値を打ちこむなら別に列挙子はいらないが enum WEEK_DAY_TAG {SUN,MON,TUE,WED,THU,FRI,SAT}; //めんどくさいけどtypedefを列挙することになる typedef Juna::Enumeration WeekDay; typedef WeekDay::Enumerator Sunday; typedef WeekDay::Enumerator Monday; typedef WeekDay::Enumerator Tuesday; typedef WeekDay::Enumerator Wednesday; typedef WeekDay::Enumerator Thursday; typedef WeekDay::Enumerator Friday; typedef WeekDay::Enumerator Saturday; { WeekDay d = Sunday(); //かっこがちょっとダサいけど if (d == Sunday()) d = Monday(); switch (d.Value()) { case Sunday::value: case Monday::value: case Tuesday::value: case Wednesday::value: case Thursday::value: case Friday::value: case Saturday::value: } } */