この質問の前置きとして、私はさまざまなC ++ユーティリティ関数と(必要な場合は)マクロを、自分で使用するためのより大きなツールキットに実装してきました。最近、BOOST_FOREACHと反復可能な意識関数に基づいてさまざまなループマクロを作成していました。
簡単に言うと、BOOST_FOREACHを使用する列挙ループを作成するのに苦労しましたが、ループの反復ごとにインクリメントされる追加のパラメーターが渡されました。これは、多くのボイラープレートコードを追加せずに任意のイテレーターをループするときに役立つPythonのenumerateコマンドのように機能します。マクロはBOOST_FOREACHのような形式を取ります。
ENUMERATE_FOREACH(COUNT, VAR, COL)
そしてこれを効果的に行いますが、不均衡な'}'を配置して閉じる(または他のループ終了マクロ)ことに依存することはありません:
COUNT = 0; BOOST_FOREACH(VAR, COL) { COUNT++; ...Rest of loop...
C++で非C++演算子を作成しようとしているという非難を受ける前に、これが外国の概念をC ++に詰め込んでいることを十分に認識しており、PythonizeC++コードを試していません。極端な依存関係なしに、既知のツールセット/ブーストを使用してこのようなループをクリーンに実装できるかどうか、私は単に興味があります。このようなマクロ定義があると、反復するときにカウントする必要がある特定のスタイルのループのバグの原因となる可能性がなくなり、COUNT変数の目的が明確になります。
BOOST_FOREACHに入る前にCOL変数でテンプレートラッパーを実行することを考えましたが、COLの可能性の数は、異なるバージョンのENUMERATE_FOREACHを作成し、多くのBOOST_FOREACHを再実装せずに、反復可能な変数のいくつかの組み合わせでそれを困難/不可能にします- -膨大なテスト/時間のない、困難でばかげた価値のあるタスク。
別のインライン関数を実行することは機能する可能性がありますが、ループの構文が壊れて、(すでに実装した)各スタイルの演算子関数の受け渡しの状況になります。
これにより、boostのライブラリからforeach.hppの最後の行を取得し、追加の引数に独自のインクリメント演算子を挿入することになりました。次に、ブーストバージョンに依存するようになり、ハッキーなカスタムマクロの破壊をブーストするための新しい更新(構文の変更)について心配します。
私が考えた最後のオプションは、ENUMERATE_BEGINとENUMERATE_ENDを実行して、イテレーターのインクリメント操作を非表示にすることです。このアプローチは、ユーザーが1つではなく2つのマクロを配置する必要があるため、単一のマクロよりもエラーが発生しやすくなります。ただし、これが唯一の単純な解決策である可能性があります。
私はSOや他の情報源を調べて、誰かが以前にこれを試したことがあるかどうかを確認しました。うまくいけば、誰かがそのような実装の概念をうまく試したか、私のアプローチを変えることについてのアイデアを持っています。これを行うためのクリーンな方法がない場合は、カウントしたいときにcount++でループを開始し続けることができます。繰り返しになりますが、これは好奇心であり、誰かが私が口論したアイデアの1つは、完全に合理的なアプローチであるか、それが得られる限り優れていると提案するかもしれません。