你觉得这个for循环宏怎么样?
What do you think to this for loop macro?
#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
子句,因此循环体中的else
s不会绑定到正确的if
, if
后面跟着太多的else
子句也不会导致错误。
您可以尝试使用else
子句而不是if
的then
子句。EDIT:实际上,既然您只使用if
s来引入变量,为什么不像您在其他地方所做的那样使用for
呢?
你的宏也阴影任何我称之为b
,这可能是非常烦人的。也许用标记粘贴给它一个不太可能的名字?
这是一个相当主观的问题,所以我的回答可能也会很主观。
通过使用这个宏,你实际上创建了一种c++方言,其他熟悉c++的人一开始都无法轻松阅读。对于您自己维护的项目来说,这不是问题,但在任何专业环境中,其他人将来必须阅读或更新您的代码是不可避免的事实。您只编写一次代码(这可能会节省少量代码),而人们将在应用程序的整个生命周期中阅读它。由于这些原因,我建议不要使用宏。
还要注意,在许多情况下,像copy
(流迭代器)和for_each
(可能与lambdas结合使用)这样的算法可以非常有表现力地完成您可能尝试使用for循环做的事情,并支持所有方向的迭代,只需选择传递给算法的迭代器。
建议使用相同/类似功能的包装器。据我所知,这只是一个概念,需要改进。
#include <iostream>
#include <vector>
template < typename Iter >
struct range
{
Iter m_begin;
Iter m_end;
struct Iterator// : std::iterator < ... >
{
Iter m;
Iter operator*() const
{ return m; }
bool operator!= (Iterator const& p) const
{ return m != p.m; }
Iterator& operator++()
{ ++m; return *this; }
};
Iterator begin()
{
return Iterator{m_begin};
}
Iterator end()
{
return Iterator{m_end};
}
};
template < typename Cont >
range < typename Cont::iterator > make_range(Cont& p)
{ return {p.begin(), p.end()}; }
template < typename Cont >
range < typename Cont::reverse_iterator > make_reverse_range(Cont& p)
{ return {p.rbegin(), p.rend()}; }
int main()
{
std::vector<int> v = {1,2,3,4,5};
for(auto it : make_reverse_range(v))
{
auto var = *it;
std::cout << var << std::endl;
}
}
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 你觉得这个for循环宏怎么样?