1

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

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

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

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

我试图创建自己的特征类来区分和过滤具有我上面描述的约束的迭代器,但我遇到了模板语法问题。我正在寻找其他人关于他们如何解决这个问题的反馈。

谢谢

4

1 回答 1

1

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

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

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

于 2012-06-17T16:00:42.500 回答