没有虚拟方法,因为它们不是多态地使用(在运行时多态性的常识中),而是通过模板(静态多态).常见的方法是使函数将迭代器模板化迭代器的类型.您可以在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中找到.