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

时间:2018-04-24 02:19:49

标签: c++ stl iterator

我正在编写一个带有as参数的函数,它是任何类型数据结构的迭代器。

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

但是,由于我的算法,我必须确保迭代器是一个随机访问迭代器。如何重新定义我的功能,例如只有Random Access Iterator可以用作参数?

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

1 个答案:

答案 0 :(得分:2)

未编译的代码:

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中会给你一个编译时错误 - 以及一条很好的错误信息。