最終更新日時:
が更新

履歴 編集

非互換性

以前の Boost のリリース(1.28)とはいくつか非互換な部分がある。 それらは大雑把に言って三つのカテゴリにわけられる。

  • BOOST_PP_REPEAT に基づく水平反復
  • 再入構文
  • list の畳み込み

反復ターゲット

まず、最も広く使われていると思われるのは、BOOST_PP_REPEAT へ渡されるターゲットマクロと、BOOST_PP_REPEAT を使った水平反復の構成である。 これはターゲットマクロを必要とするような全ての BOOST_PP_REPEAT_* と全ての BOOST_PP_ENUM_* を含む。

非互換性は自明であるが、それはソースの変更を必要とする。

これらのターゲットマクロは 第3の 引数を期待するようになった。 追加されたのは各ターゲットマクロの 最初の パラメータである。 It represents the next repetition dimension and brings BOOST_PP_REPEAT inline with rest of the library.

したがって次のようであったものは:

# define macro(n, data) ...
BOOST_PP_REPEAT(5, macro, data)

...次のようになる:

# define macro(z, n, data) ...
BOOST_PP_REPEAT(5, macro, data)

このパラメータは BOOST_PP_REPEAT メカニズムへの非常に効率的な再入に利用できる。 しかしながら、ライブラリは自動的に次の反復次元を見つけるため、それを必ずしも使う必要はない。

次元の順序付け

しかしこの自動的な検知により、BOOST_PP_REPEAT_1STBOOST_PP_REPEAT_2NDBOOST_PP_3RDを順序からはずれて使うことは安全でない。 これらのマクロは 自動再帰 メカニズムをバイパスし、また 自動再帰 メカニズムは適切な順序でマクロが使われることに依存している。 これらのバイパスマクロを使うなら、一番外側の反復は BOOST_PP_REPEAT_1ST、次が BOOST_PP_REPEAT_2ND、最後が BOOST_PP_REPEAT_3RDなければならない。 それ以外の使いかたはライブラリによってサポートされない。 時々は動作するかもしれないが、動作しないこともあるかもしれない。

再入構文

自動再帰 も同様の問題がある。 以前は BOOST_PP_WHILE の再帰構文(と同様に BOOST_PP_FOR)は次のようであった:

BOOST_PP_WHILE ## d(pred, op, state)

...あるいは:

BOOST_PP_CAT(BOOST_PP_WHILE, d)(pred, op, state)

自動再帰 モデルにおいて、BOOST_PP_CAT バージョンは使えない。 なぜなら BOOST_PP_CAT は連結の前に引数の展開を許すが、BOOST_PP_WHILE は引数無しで展開するからである。 このライブラリでそれは3つのパラメータを取るように見えるが、しかしそれは 自動再帰 のトリックである。 それは次のようなものと同様である:

# define A(x, y) ...
# define B A
// ...
B(2, 3)

この構文は B マクロが2つの引数をとるように見えるが、実際はそうではない。 この B マクロが A に推移することを除いては、 自動再帰 メカニズムも同様の流儀で動作する。

いくつかのプリプロセッサは動作が遅いため、直接的な再入(自動再帰 無しの)がいくつかの非自明なケースでいまだに必要とされる。 その結果、ライブラリは再入のために新しい構文を使う:

BOOST_PP_FOR_ ## r(state, pred, op, macro)
BOOST_PP_REPEAT_ ## z(count, macro, data)
BOOST_PP_WHILE_ ## d(pred, op, state)

畳み込み

以前は BOOST_PP_LIST_FOLD_RIGHT マクロの引数は BOOST_PP_LIST_FOLD_LEFT の逆順であった。 また、BOOST_PP_LIST_FOLD_RIGHT へ渡される集積マクロも逆の引数で呼ばれていた。 この食い違いは解消された。

例示すると、BOOST_PP_LIST_FOLD_RIGHT は次のようであった:

# define macro(d, elem, state)
BOOST_PP_LIST_FOLD_RIGHT(macro, list, state)

これは次のように置き換わった...

# define macro(d, state, elem)
BOOST_PP_LIST_FOLD_RIGHT(macro, state, list)

概要

このライブラリは1.28リリースには無い新しい機能をたくさん持っていて、このリストはそれら全てを列挙するものではない。 これは単に、新しいリリースに互換となるためにコードを変更したければならないもののリストである。

See Also

  • BOOST_PP_FOR
  • BOOST_PP_LIST_FOLD_RIGHT
  • BOOST_PP_REPEAT
  • BOOST_PP_WHILE

Paul Mensonides