#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)不适用于列表等所有数据结构.但我仍然觉得它很方便.
解决方法:
不确定我喜欢这个. if条件没有相应的else子句,因此循环体内的elses将不会绑定到正确的if和if后面跟着太多else子句不会导致错误.
您可以尝试使用else子句而不是if的then子句.编辑:实际上,既然你只使用ifs来引入变量,那么为什么不像其他地方那样使用?
你的宏也会影响我所谓的b,这可能非常烦人.也许使用令牌粘贴来给出一个不太可能的名字?
标签:c,c11,for-loop 来源: https://codeday.me/bug/20190831/1779454.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。