筛选模板函数的特定迭代器

Filtering specific iterators for template functions

本文关键字:迭代器 函数 筛选      更新时间:2023-10-16

我正在开发一组函数,它利用了具有打包和顺序内存存储(用于内存副本)的容器。 它们具有大多数 STD 函数样式的函数签名,输入/输出迭代器指向元素并表示范围。 例如,一个函数可能看起来像这样:

template< typename InputIterator, typename OutputIterator >
OutputIterator fooBar( InputIterator& first, InputIterator& last, 
                       OutputIterator& result );

我希望验证传递的迭代器是否合法,即打包和顺序。 对于 STD 容器,这仅限于 std::vector 和 std::array。 不幸的是,我不能依赖迭代器"类别"特征,因为随机访问特征并不意味着顺序存储。 这方面的一个例子是 Microsoft concurrent_vector 类,此处记录了并行容器

此外,我也不能接受来自向量和数组类的所有迭代器,例如我需要拒绝反向迭代器,并且 std::vector <bool>迭代器不适合,因为它使用的代理类。

我尝试创建自己的 traits 类来使用上面描述的约束来区分和过滤迭代器,但我遇到了模板语法问题。 我正在寻找其他人关于他们将如何处理这个问题的反馈。

谢谢

我认为你不能这样做。迭代器是一种抽象,其全部目的是使迭代过程独立于底层体系结构。标准迭代器中没有任何信息表示底层内存结构,甚至没有任何远程相似的东西。

在类似标准算法的函数上,通常建议按值传递迭代器,因为它们应该是便宜/小对象。应该特别注意的是,你的函数永远不能被调用为fooBar(c.begin(), c.end(), some_out_it);,因为它通过引用非常量来获取输入迭代器。

最后一点,您可以通过测试迭代器类型是否是std::reverse_iterator<Iter>的专用化来过滤掉反向迭代器,因为至少标准容器的Container::(const_)reverse_iterator类型需要是一个。