虚拟前进迭代器?

4 c++ iterator

我查看了STL的前向迭代器.我在任何地方都看不到任何虚拟功能.如果我有一个想要字符串的前向迭代器的库,我怎么能让函数接受任何返回字符串的前向迭代器?我可以使用标准库中的任何内容吗?

Dav*_*eas 6

没有虚拟方法,因为它们不是多态地使用(在运行时多态性的常识中),而是通过模板(静态多态).常见的方法是使函数将迭代器模板化迭代器的类型.您可以在STL算法标题中找到许多示例:

template <class InputIterator, class Distance>
inline void distance(InputIterator first, InputIterator last, Distance& n);
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下:

template <class ForwardIterator> // or InputIterator or whatever your needs are
void acceptIterators( ForwardIterator start, ForwardIterator end );
Run Code Online (Sandbox Code Playgroud)

它必须引用字符串的附加限制可以用类型traits和enable_if来实现:

template <class ForwardIterator>
std::enable_if< std::is_same< std::string,
                              typename iterator_traits<ForwardIterator>::value_type > >
void acceptIterators( ForwardIterator start, ForwardIterator end );
Run Code Online (Sandbox Code Playgroud)

使用来自c ++ 0x的typetraits,但如果在不支持它们的编译器中需要它们enable_if,is_same则可以在boost中使用.

如果需要能够在运行时切换迭代器的类型,则可能需要查看any_iterator在提供运行时多态接口的特定迭代器上执行类型擦除.在C++ 文档中关于面向对象和通用编程之间的张力的文章中描述了该实现,该实现可以在Adobe STLab中找到.