前回の続きです。
関数だって呼べちゃいます。
void Func_Apple();
void Func_Grape();
void Func_Banana();
#define X(A) Func_##A
void (*func[])() = {
#include "Fruits.lst"
};
#undef
これで、enumが定義されていれば、こんな感じで関数が呼べます。
func[Banana]();
さらに、クラスも作れちゃいます。
class CApple: public Fruits {...};
class CGrape: public Fruits {...};
class CBanana: public Fruits {...};
template <class T>
Fruits *createFruits{ return new T;};
#define X(A) createFruits<C##A>
Fruits *(*create[])() = {
#include "Fruits.lst"
};
#undef
これで、Appleの名前でCAppleクラスが作れるようになります。
Fruits *fruits = create[Apple]();
ということで、C++でもリフレクションのように文字列からクラスを生成する方法でした。
(結局これが書きたかった。)
使いどころは…あるような…ないような…。
以前に使ったことはあるんですけど…結局良かったのやら悪かったのやら。