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

Posted

技术标签:

【中文标题】如何确保函数模板的参数是随机访问迭代器?【英文标题】:How to make sure the parameters of function template are random access iterator? 【发布时间】:2018-04-24 02:19:49 【问题描述】:

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

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

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

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

【问题讨论】:

查找“概念”和“SFINAE”。 你只是像随机访问迭代器一样使用它,如果它不是随机访问迭代器,那么它不会编译。 建议您将类型参数命名为RandomAccessIterator,以便人们(以及最终的概念)了解需求 【参考方案1】:

未编译的代码:

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

iterator_traits&lt;&gt;::iterator_category 告诉你它是什么类型的迭代器。将其与std::random_access_iterator_tag 进行比较可以告诉您它是否是随机访问迭代器。

如果不满足条件,将整个内容包装在 static_assert 中会给您一个编译时错误 - 以及一个很好的错误消息。

【讨论】:

如果ContiguousIterators 曾经获得标签,则需要std::is_base_of&lt;std::random_access_iterator_tag, std::iterator_traits&lt;Iterator&gt;::iterator_category&gt;::value

以上是关于如何确保函数模板的参数是随机访问迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

容器小结

c++模板和迭代器

模板参数推导

bingc++模板STL(stringvectorlist)

bingc++模板STL(stringvectorlist)

STL详解—— list的模拟实现