c++ - 如何确保函数模板的参数是随机访问迭代器?

标签 c++ stl iterator

我正在编写一个以 has 作为参数的函数,它是任何类型数据结构的迭代器。

template<class Iterator>
void Foo(Iterator first, Iterator last) {
 ...
}

但是,由于我的算法,我必须确保迭代器是随机访问迭代器。如何重新定义我的函数,例如只能将随机访问迭代器用作参数?

我可以将我的迭代器用作随机访问迭代器,因此在其他情况下代码不会(或可能不会?)编译。但我不确定这是最优雅的解决方案。

最佳答案

未编译代码:

static_assert(std::is_same<std::iterator_traits<Iterator>::iterator_category, 
              std::random_access_iterator_tag>::value, 
              "Random-access iterators are required" );

iterator_traits<>::iterator_category给你它是什么类型的迭代器。将其与 std::random_access_iterator_tag 进行比较告诉您它是否是随机访问迭代器。

将整个东西包装在 static_assert 中如果不满足条件,则会出现编译时错误 - 以及一条不错的错误消息。

关于c++ - 如何确保函数模板的参数是随机访问迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49992495/

相关文章:

c++ - 泛化标准库容器的输出函数

c++ - 如何更改适配器容器的基本底层容器类型?

c++ - 更漂亮的 "pointer to last element"语法,std::vector?

c# - 有没有一种方法可以将两个单独的迭代器 block 合并为一个?

c++ - Boost 记录器链接问题

c++ - Linux vs Windows std::map 赋值构造函数(为什么会有这样的差异?)

C++、调试符号和 GDB

c++ - 如何用 vector 中的另一个范围替换一个范围?

Java - HashSet 实现不支持 remove() 的迭代器的最佳方式

PHP+MySQL,按类别输出结果