複数のEnumを一つにまとめる(C++)
自分のメモ用で、列挙を一つにまとめる方法
#include <stdio.h> #include <map> using namespace std; // 誕生月列挙 namespace Month { enum { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, Max }; } // クラス列挙 namespace Class { enum { A, B, C, Max }; } // 生徒の誕生日の列挙 namespace StudentBarth { enum { // Name Class Birth Month Day Takashi = ( Class::A << 16 ) | ( Month::Feb << 8 ) | ( 14 ), Ryuta = ( Class::A << 16 ) | ( Month::Aug << 8 ) | ( 8 ), Kaori = ( Class::C << 16 ) | ( Month::Aug << 8 ) | ( 8 ), Shuzo = ( Class::B << 16 ) | ( Month::Nov << 8 ) | ( 6 ), }; } typedef void(*Myfunction)( void ); map<int, Myfunction> birthNotice; static void InitializeFuncList( void ); static void NobodyBirth( void ); static void BirthdayOfTakashi( void ); static void BirthdayOfRyuta( void ); static void BirthdayOfKaori( void ); static void BirthdayOfShuzo( void ); int main( void ) { // 連想配列を初期化 InitializeFuncList(); #define GetMapIndexFromStudentInfo( className, month, day ) \ ( (Class::##className < 16) | (Month::##month < 8) | (day) ) // 検索するクラス・誕生日を配列に登録 const int DataCount = 5; int searchBirth[DataCount]; searchBirth[0] = GetMapIndexFromStudentInfo( A, Aug, 8 ); searchBirth[1] = GetMapIndexFromStudentInfo( C, Aug, 8 ); searchBirth[2] = GetMapIndexFromStudentInfo( B, Nov, 6 ); searchBirth[3] = GetMapIndexFromStudentInfo( A, Feb, 14 ); searchBirth[4] = GetMapIndexFromStudentInfo( C, Jan, 31 ); #undef GetMapIndexFromStudentInfo // 該当するクラス・誕生日の人を表示する for ( int i = 0; i < DataCount; i++ ) { int birth = searchBirth[i]; if ( birthNotice.find( birth ) == birthNotice.end() ) { NobodyBirth(); } else { Myfunction call = birthNotice[ birth ]; call(); } } system( "Pause" ); return 0; } // 連想配列の初期化を行います static void InitializeFuncList( void ) { birthNotice[ StudentBarth::Takashi ] = BirthdayOfTakashi; birthNotice[ StudentBarth::Ryuta ] = BirthdayOfRyuta; birthNotice[ StudentBarth::Kaori ] = BirthdayOfKaori; birthNotice[ StudentBarth::Shuzo ] = BirthdayOfShuzo; } // 以下表示用 static void NobodyBirth( void ) { printf( "該当する誕生日の人はいません\n" ); } static void BirthdayOfTakashi( void ) { printf( "Takashi の誕生日\n" ); } static void BirthdayOfRyuta( void ) { printf( "Ryuta の誕生日\n" ); } static void BirthdayOfKaori( void ) { printf( "Kaori の誕生日\n" ); } static void BirthdayOfShuzo( void ) { printf( "Shuzo の誕生日\n" ); }
実行結果
Ryuta の誕生日 Kaori の誕生日 Shuzo の誕生日 Takashi の誕生日 該当する誕生日の人はいません 続行するには何かキーを押してください . . .