使ったこと無いなーと思いまして、触り程度にちょっとだけ
例えば以下のように、ある一部分を除いてほぼ同じ内容の関数をたくさん定義しなきゃいけない場合
void test1() {
cout << "A" << endl;
}
void test2() {
cout << "B" << endl;
}
…(以下延々と続く)…
[/cpp]
Boost.Preprocessorのリファレンスをだらだら眺めながら、以下のように書いてみました。
ちゃんと上記のように展開されるようです。
[cpp]
#define SEQ1 (test1) (test2) (test3) (test4)
#define SEQ2 (A) (B) (C) (D)
#define MACRO(r,data,i,elem) \
void elem () { \
cout << BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(i,SEQ2)) << endl; \
}
BOOST_PP_SEQ_FOR_EACH_I(MACRO, _, SEQ1)
[/cpp]
BOOST_PP_SEQ_FOR_EACH_Iを使ってMACROをSEQ1の数だけ展開して、
そのMACROの中ではインデックスiを使ってSEQ2にアクセスする感じで。
STRINGIZEは、標準の#xみたいなやつですね。
今の自分には使う機会が思いつきませんが、いつか必要になった時のとっかかりになればという事で。