我正在开发一组函数,这些函数利用了具有打包和顺序内存存储的容器(用于内存副本)。它们具有大多数STD函数样式的函数签名,输入/输出迭代器指向元素并表示范围。例如,函数可能如下所示:
template< typename InputIterator, typename OutputIterator >
OutputIterator fooBar( InputIterator& first, InputIterator& last,
OutputIterator& result );
我希望验证传递的迭代器是合法的,是打包的还是顺序的。对于STD容器,这仅限于std :: vector和std :: array。不幸的是,我不能依赖迭代器“类别”特征,因为随机访问特征并不意味着存储。一个例子是microsofts concurrent_vector类,在此记录parallel containers
另外,我不能接受来自vector和数组类的所有迭代器,例如我需要拒绝反向迭代器,而std :: vector <bool
&gt;迭代器因其使用的代理类而不适合。
我试图创建自己的traits类来区分和过滤迭代器与上面描述的约束,但我遇到了模板语法问题。我正在寻找其他人如何解决这个问题的反馈。
由于
答案 0 :(得分:1)
我认为你不能这样做。迭代器是一种抽象,其完整目的是使迭代过程独立于底层架构。标准迭代器中没有信息表示底层内存结构甚至是远程类似的任何信息。
在类似std算法的函数中,通常建议按值传递迭代器,因为它们应该是廉价/小对象。应特别注意,您的函数永远不能被称为fooBar(c.begin(), c.end(), some_out_it);
,因为它通过引用到非const来获取输入迭代器。
最后一点,您可以通过测试迭代器类型是否为std::reverse_iterator<Iter>
的特化来过滤掉反向迭代器,因为至少Container::(const_)reverse_iterator
类型的标准容器必须是一个。