我查看了STL的前向迭代器。我在任何地方都看不到任何虚拟功能。如果我有一个想要字符串的前向迭代器的库,我怎么能让函数接受任何返回字符串的前向迭代器?我可以使用标准库中的任何内容吗?
答案 0 :(得分:6)
没有虚拟方法,因为它们不打算以多态方式(在运行时多态性的常识中)使用,而是通过模板(静态多态)。常见的方法是使函数将迭代器模板化迭代器的类型。您可以在STL算法标题中找到许多示例:
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
。文章On the Tension Between Object-Oriented and Generic Programming in C++中对此进行了描述,可以在Adobe STLab中找到该实现。
答案 1 :(得分:1)
您可以编写自己的迭代器并将其用作:
std::for_each( make_myiterator(c.begin), make_myiterator(c.end), do_some() );
您可以从std::iterator
继承,或检查Boost Iterator Facade - 它可以帮助您编写自己的迭代器。
答案 2 :(得分:0)
通常的方法是创建使用迭代器函数模板的函数。这就是标准库的作用。
答案 3 :(得分:0)
如果你想接受任何迭代器,例如你需要使用模板的字符串。所有其他迭代器都没有继承顶级迭代器类。
编写符合要求的C ++迭代器可能会很麻烦,但如果您不怕模板,Boost.Iterators可以帮助您。有一个example on how to use iterator_facade来创建一个你应该看一下的简单迭代器。 Boost.Iterators是一个仅头文件库,因此无需将任何内容与您的应用程序/库链接。