C++17 引入了 ContiguousIterator http://en.cppreference.com/w/cpp/iterator的概念。然而,似乎并没有计划让contiguous_iterator_tag
(以我们现在的方式random_access_iterator_tag
)报告std::iterator_traits<It>::iterator_category
。
为什么contiguous_iterator_tag
失踪?
是否有传统的协议来确定迭代器是否是连续的?还是编译时测试?
过去我提到,对于容器,如果有一个.data()
成员可以转换为::value
类型指针,并且有.size()
成员可以转换为指针差异,那么应该假设容器是连续的,但我无法提取迭代器的类似特性.
一种解决方案可能是还具有data
用于连续迭代器的功能。
当然 Contiguous 概念适用&(it[n]) == (&(*it)) + n
于 , for all n
,但这不能在编译时检查。
编辑:我发现这个视频将其置于更广泛的 C++ 概念背景中。CppCon 2016: Patrick Niedzielski撰写的“在现代多核世界中构建和扩展迭代器层次结构” 。该解决方案使用概念(Lite),但最终的想法是连续迭代器应该实现一个pointer_from
函数(与我的data(...)
函数相同)。
结论是概念将有助于将理论形式化,但它们并不是魔法,因为某人、某处将在连续的迭代器上定义新的特别命名的函数。该演讲概括为分段迭代器(具有相应的函数segment
和local
),不幸的是它没有提及跨步指针。
编辑 2020:
现在标准有
struct contiguous_iterator_tag: public random_access_iterator_tag { };