#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)不适用于所有数据结构,例如列表。但我仍然认为它很方便。