C++

【no more コピペ】一度列挙しただけで、いろいろ同時に定義する方法

enumと同時に同じ内容の文字列を定義したい時など、コピペせずにやる方法の紹介です。

#include <iostream>

using namespace std;

//名前を列挙する この時点ではE()は定義されていない
#define ENM \
E(AAA)\
E(BBB)\
E(CCC)

//enum定義
#define E(x) x,
enum MyEnum {
    ENM

    //ここが
    // AAA,
    // BBB,
    // CCC,
    //と展開される
};
#undef E

//文字列定義
#define E(x) #x,
const char* strs[] = {
    ENM

    //ここが
    // "AAA",
    // "BBB",
    // "CCC",
    //と展開される

};
#undef E

//関数宣言
#define E(x) void func_##x();
    ENM
    //ここが
    // void func_AAA();
    // void func_BBB();
    // void func_CCC();
    //と展開される
#undef E

//switch case文と、関数呼び出し
int func_x(MyEnum x) {
    switch(x) {
    #define E(x) case x: func_##x(); break;
    ENM
    //ここが
    // case AAA: func_AAA(); break;
    // case BBB: func_BBB(); break;
    // case CCC: func_CCC(); break;
    //と展開される
    #undef E
    }
    return 0;
}

int main() {
    func_x(AAA);
    func_x(BBB);
    func_x(CCC);
}

void func_AAA() {
    cout << "func_AAA\n";
}
void func_BBB() {
    cout << "func_BBB\n";
}
void func_CCC() {
    cout << "func_CCC\n";
}

https://repl.it/@mas_yo/enum-auto-declare