もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

複数の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 の誕生日
該当する誕生日の人はいません
続行するには何かキーを押してください . . .