2011-02-22 32 views
5

Yükseltici yineleme cephesi olan herhangi bir yineleyiciyi uygulamak mümkün mü? benim BaseClass içinde uygulama ayrıntıları tanımlamak istemiyorumAnyIterator ve yükseltici yineleyici cephesi

class Base 
{ 
public: 
typedef std::vector<int>::iterator iterator;//implementation detail 
... 
virtual iterator begin()=0; 
virtual iterator end()=0; 
}; 

veya i sıfırdan tamamen bir yazmak zorundayım;

+0

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? –

+1

http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html adresinde bulabilirsiniz. – UncleBens

cevap

9

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:

  1. Becker any_iterator (boost::iterator_facade uygulayan olan)
  2. opaque_iterator kütüphanesinden (: STL ile gevşek uyumluluk ... Bir polimorfik yineleyici sancının üç uygulamaları biliyoruz bunun için google) veya
  3. 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". =

3

:-) elbette 'verim' olmadan bu aradığınız şey olabilir düşünüyorum

(*): İşte

any_iterator: Type Erasure for C++ Iterators

parçacık ' bu sayfa ::

Genel Bakış

Sınıf şablonu any_iterator, yineleyiciler için boost :: işlevinin analogudur. Bu yineleyiciler, uygun bir ortaklığa sahip oldukları sürece, tek bir değişkene sahip olmanıza ve yineleyicilere farklı türler atamanıza olanak tanır.