筛选模板函数的特定迭代器
Filtering specific iterators for template functions
我正在开发一组函数,它利用了具有打包和顺序内存存储(用于内存副本)的容器。 它们具有大多数 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
类型需要是一个。
- 如何在C++中将迭代器作为函数参数传递
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 如何创建迭代器函数
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 使用迭代器的模板类的构造函数
- C++:复制迭代器的构造函数
- 基于函数而不是集合的二分搜索或迭代器?
- 成员函数中的迭代器出现问题
- 使用迭代器的自定义比较器函数
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 如何基于循环迭代器选择函数
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 具有C++迭代器参数的多功能函数
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- C++ 对自定义映射迭代器函数的未定义引用