簡體   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