Boost.PP シーケンスは 256 要素に制限されています。これを回避するには、次のように定義される 2 次元シーケンスまたはシーケンスのシーケンスを使用します。
((0)(1)(2)...(255))((256)(257))
のようなアルゴリズムを提供するためにBOOST_PP_SEQ_FOR
、次のように 2 つのアルゴリズムをネストします。
//Inner loop
#define ELEM_ID_OP(_, func, elem) func(elem)
#define FOR_ELEM(func, seq) \
BOOST_PP_SEQ_FOR_EACH(ELEM_ID_OP, func, seq)
//Outer loop
#define SEQ_ID_OP(_, func, seq) FOR_ELEM(func, seq)
#define FOR_SEQ(func, multiseq) \
BOOST_PP_SEQ_FOR_EACH(SEQ_ID_OP, func, multiseq)
//Testing function
#define MYFUNC(arg) \
const int arg = 0;
FOR_ELEM(MYFUNC, (Zero)(One)(Two)) //works like a charm
FOR_SEQ(MYFUNC, ((zero)(one)(two))) //doesn't :(
2 つ目では、宣言されていない識別子に関する複数のエラーが発生しています。
エラー C2065: 'ELEM_ID_OP': 宣言されていない識別子
エラー C2065: 'MYFUNC': 宣言されていない識別子
エラー C2065: 'zero': 宣言されていない識別子
エラー C2065: 'one': 宣言されていない識別子
エラー C2065: 'two': 宣言されていない識別子
これは、コンパイラの最大再帰深度に達したため、マクロが展開されなくなったことを意味しELEM_ID_OP
ますMYFUNC
か? または、これが機能しないようにする Boost.PP の実装の詳細はありますか? これに対する回避策はありますか?
それが役立つ場合、私はVC++ 2013を使用しています。