#include <string>

using namespace std;


#define ENUMCLASSHELP(Enum, name) case Enum::##name: return #name;

#define ENUMLOOP(Enum, name) ENUMCLASSHELP(Enum, name)

#define ENUMLOOP2(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP(Enum, ##__VA_ARGS__)

#define ENUMLOOP3(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP2(Enum, ##__VA_ARGS__)

#define ENUMLOOP4(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP3(Enum, ##__VA_ARGS__)

#define ENUMLOOP5(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP4(Enum, ##__VA_ARGS__)

#define ENUMLOOP6(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP5(Enum, ##__VA_ARGS__)

#define ENUMLOOP7(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP6(Enum, ##__VA_ARGS__)

#define ENUMLOOP8(Enum, name, ...) ENUMCLASSHELP(Enum, name) ENUMLOOP7(Enum, ##__VA_ARGS__)

#define ENUMCLASS(Enum, count, ...) enum class Enum{ __VA_ARGS__ }; \

string toString(Enum e) { switch (e){ ENUMLOOP##count(Enum, ##__VA_ARGS__) } }


ENUMCLASS(E_test, 3, a, b, c);

ENUMCLASS(E_test2, 8, a1, a2, a3, a4, a5, a6, a7, a8);


ENUMLOOP8(temp, a, b, c, d, e, f);



헬프