#define for_all_impl(var, cont, mode) for (auto var##_begin_it = cont.##mode##begin(), var##_end_it = cont.##mode##end(), var##_it = var##_begin_it; var##_it != var##_end_it; ++var##_it) if (bool b = true) for (auto& var(*var##_it); b; b = false, var) if (bool b = true) for (const auto var##_num(var##_it - var##_begin_it); b; b = false, var##_num)
#define for_all(var, cont) for_all_impl(var, cont, )
#define for_all_const(var, cont) for_all_impl(var, cont, c)
#define for_all_reverse(var, cont) for_all_impl(var, cont, r)
#define for_all_const_reverse(var, cont) for_all_impl(var, cont, cr)
int main()
{
std::vector<int> a; a.push_back(0); a.push_back(1); a.push_back(2); a.push_back(3);
for_all(i, a)
{
std::cout << i_num << ": " << i << std::endl;
}
}
私がこれを作成した理由は、C++ には長い間、大量の入力なしでデータ構造を反復処理するための簡単な近道がなかったからです。これで、新しい範囲ベースの for ループ構文ができましたが、現在のインデックスを取得したり、逆方向に移動したりする簡単な方法はありません (私が知っていることです)。
私はそれを設計するのに多くの時間を費やしたので、疑いの恩恵を受けて、大きな欠陥を指摘してください. 通常の変数名のみがパラメーターとして使用されると仮定しました。私はそれをすべての人に提案しているわけではありませんが、大きな問題がない限り、今後は私のプロジェクトで使用します.
ありがとう。
編集:リストなどのすべてのデータ構造に対してインデックス カウンター (i_num) が機能しないことを認識しています。でもやっぱり便利だと思います。