2

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を使用しています。

4

1 に答える 1