繁体   English   中英

虚拟前向迭代器?

[英]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_ifis_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM