Gönderdiğiniz kod, Base
'dan döndürülen yineleyici türlerini ve tüm uygulayanlarını std::vector<int>::iterator
olarak belirlemiştir; bu muhtemelen istediğiniz gibi değildir. Jeremiah önerisi tek dezavantajı ile gitmek için bir yoldur:
- Becker
any_iterator
(boost::iterator_facade
uygulayan olan)
opaque_iterator
kütüphanesinden (: STL ile gevşek uyumluluk ... Bir polimorfik yineleyici sancının üç uygulamaları biliyoruz bunun için google) veya
- Adobe'nin
any_iterator
s uyumlu bir STL hiyerarşisi içeren çok ilginç bir poli kütüphanesi.
sorun Göründüğünden daha zordur ... Ben adım adım elde gibi STL ile temiz bir şekilde uygulamak zordur any_iterators
tip argüman (any_iterator<Derived>
any_iterator<Base>
otomatik dönüştürülebilir olmalıdır) içinde kovaryansını gerekli çünkü bir çoğunlukla kendim girişimi yapılmış . Bir C# Enumerator<T>
'un uygulanması daha kolaydır (*) (ve genellikle STL benzeri yineleyici çiftlerinden daha temiz bir kavramdır) ama yine de STL'yi "kaybedersiniz". =
Ben muhtemelen bir Java veya C# yineleyici gibi davranır Yineleyiciyi '' gibi bir soyut temel sınıf tanımlamaktır yapacağını yolu, bunun bir şablonu uygulama keyfi yineleyiciler için, daha sonra bir sarmak için Boost.Iterator kullanmak Herhangi bir Iterator 'üstünde yineleyici arabirimi. Bunun için sahte kod taslağı çizmemi mi istiyorsun? –
http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html adresinde bulabilirsiniz. – UncleBens