これを比較的クリーンな方法で処理するプリプロセッサマクロ(@Artyerによって大幅に簡略化されたもの)を作成しました。
#define for_indexed(...) for_indexed_v(i, __VA_ARGS__)
#define for_indexed_v(v, ...) if (std::size_t v = -1) for (__VA_ARGS__) if ((++v, true))
使用例:
std::vector<int> v{1, 2, 3};
for_indexed (auto const& item : v) {
if (i > 0) std::cout << ", ";
std::cout << i << ": " << item;
}
別のループ変数を使用するには:
for_indexed_v (my_counter, auto const& item : v) ...
追加の制御フローロジックは、デバッグ以外のビルドでは最適化する必要があります。比較的読みやすいループ構文が残ります。
2020年の注意:マクロトリックの代わりにラムダベースのソリューションを使用する方がおそらく賢明でしょう。もちろん、構文は「クリーン」ではありませんが、実際のC++構文として認識できるという利点があります。選択はあなた次第です。
更新2017/05/28:break;
ステートメントが正しく機能するように
更新2019/01/28:単語が有効な変数名にfor
なるようにマクロ名を入力します。競合が発生することはないとindexed
思います。アップデート2020/12/23:大幅に簡素化(@Artyerに感謝)for_indexed