[英]virtual forward iterator?
我查看了 STL 的前向迭代器。 我在任何地方都看不到任何虚拟功能。 如果我有一个需要字符串前向迭代器的库,我如何允许 function 采用任何返回字符串的前向迭代器? 标准库中有什么我可以使用的吗?
没有虚拟方法,因为它们不是用于多态(在运行时多态的常识中),而是通过模板(静态多态)使用。 常见的方法是使用 function 将迭代器模板化为迭代器的类型。 您可以在 STL 算法 header 中找到许多示例:
template <class InputIterator, class Distance>
inline void distance(InputIterator first, InputIterator last, Distance& n);
在您的特定情况下:
template <class ForwardIterator> // or InputIterator or whatever your needs are
void acceptIterators( ForwardIterator start, ForwardIterator end );
它必须引用字符串的附加限制可以根据类型特征和 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 );
使用来自 c++0x 的 typetraits,但如果您在不支持它们的编译器中需要它们,则可以在 boost 中使用enable_if
和is_same
。
如果您需要能够在运行时切换迭代器的类型,您可能需要查看any_iterator
,它在提供运行时多态接口的特定迭代器上执行类型擦除。 在 C++ 中的On the Tension between Object-Oriented and Generic Programming 一文中有描述,实现可以在Adobe STLab中找到。
您可以编写自己的迭代器并将其用作:
std::for_each( make_myiterator(c.begin), make_myiterator(c.end), do_some() );
你可以从std::iterator
继承,或者查看Boost Iterator Facade——它将帮助你编写自己的迭代器。
通常的方法是制作使用迭代器函数模板的函数。 这就是标准库所做的。
如果您想接受任何迭代器,例如字符串,您需要使用模板。 没有所有其他迭代器继承的顶级迭代器 class 。
编写符合标准的 C++ 迭代器可能会很痛苦,但如果您不害怕模板, Boost.Iterators会为您提供很大帮助。 有一个关于如何使用 iterator_facade 创建简单迭代器的示例,您应该看看。 Boost.Iterators 是一个仅限 header 的库,因此无需将任何内容与您的应用程序/库链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.