【发布时间】:2020-07-10 13:46:33
【问题描述】:
我对将迭代器语法用于其他类型的迭代很感兴趣;特别不是在容器上,而只是为了清理类似迭代的代码。
我已经有一些工作(也许 - 如果它没有损坏,不要修复?),但我想知道所有情况下迭代器的正式要求(即不同类型的迭代器,例如作为常量,以及它们的类别/标签,例如向前)。
这是我对cppreference的实现的理解
{
auto && __range = /* range_expression */;
auto __begin = __range.begin( );
auto __end = __range.end( );
for ( ;
__begin != __end;
++__begin )
{
/* range_declaration */ = *__begin;
/* loop_statement */
}
}
根据我收集到的信息,目前的要求是:
-
__range必须包含一个名为begin和end的非静态右值可访问函数成员,它们不带参数 -
begin的返回必须支持前置自增运算符 -
begin的返回必须支持解引用运算符 -
begin和end的返回必须支持不等于运算符
然后我查看标准并看到诸如 const_iterator 之类的东西,以及从 begin 和 end 返回的迭代器的所有类型别名成员,但我从未见过它们被使用过(除了算法函数之类的东西,在这种情况下,除了最终编码器之外,不存在正式要求,并且对于制作自己的迭代器的人来说不是实际要求。
【问题讨论】:
-
解释得很好here。单击特定的迭代器类型以查看它的正式要求。甚至还有一些示例实现。
-
@pptaszni 那是相当深的需求兔子洞。我也没有看到任何示例实现,但我只是粗略地看了一下。也许为外行人阐明了要寻找什么和在哪里寻找的答案?
-
嗯,抱歉,我不记得在定义类以与范围循环兼容时在哪里找到了参考 impl。无论如何,这个topic 涵盖了一些问题。无论如何,要让range loop 工作,您只需要返回iterator 的
begin和end。所有请求都可以在这 2 个链接之后找到。如果您需要,我可以提供我的示例实现。 -
你真的只对 range-for 循环感兴趣吗?
-
@DavisHerring 是的