2012-04-27 28 views
9

Sadece referans değerlerine değil, gerçek değer türlerine aykırı olan bir yineleyici oluşturmaya çalışıyorum. Bu, boost::iterator_facade kullanılarak yapılabilir veya adres \ referans ile döndürülebilen değerlere sahip olmamı gerektirir. yineleme cephesi ve dereference() işlevi

daha spesifik olmak gerekirse, benim yineleyici ( std::map::iterator gibi) benim yineleyiciler value_type çözümleyecek herhangi bir yerinde depolanan, ancak anında oluşturulmaz anlamına gelen referansların std::pair döndürür.

cevap

14

Evet, istediğiniz şey mümkündür. , boost/iterator_facade.hpp bakmak (örnek sürümü 1.49.0 ait Boost lib için ama aynı zamanda onun yeni dağılımlar için ok): Lütfen

template < 
    class Derived 
    , class Value 
    , class CategoryOrTraversal 
    , class Reference = Value& 
    , class Difference = std::ptrdiff_t 
> 
class iterator_facade 

Şablon argümanı Reference anahtarıdır. boost::iterator_facade'dan türetirken Reference belirtmelisiniz. Örneğin, kodunuz aşağıdaki gibi görünebilir:

template<typename value_type> 
class custom_iterator 
    : public boost::iterator_facade< 
      custom_iterator<value_type>, 
      value_type, 
      boost::forward_traversal_tag, 
      value_type 
     > 
{ 
    ... 
    value_type dereference() const{ return value_type(...); } 
    ... 
}; 
+0

Bu yanıt için teşekkürler, gerçekten bana yardımcı oldu. Yine de bir soru var, Referans şablonu argümanını belirtmeden önce, sadece değeri döndürmeyi denedim. Bu derlenmişti ama benim için çok tuhaf sonuçlar verdi, örneğin sınıfımdaki işaretçiler tuhaf zamanlarda boşa çıktı. Sanırım sorum şu, neden hiç derledin? – FlamFace