2012-04-27 36 views
9

Tôi đang cố gắng tạo một trình lặp mà chỉ có thể dereference để các loại giá trị thực, không phải để tham khảo. Điều này có thể sử dụng boost::iterator_facade hay không yêu cầu tôi có các giá trị có thể được trả về bởi adress \ reference.boost iterator facade and dereference() function

Để có specfic hơn, iterator của tôi trả về một std::pair tài liệu tham khảo, có nghĩa là vòng lặp của tôi value_type không được lưu trữ ở bất cứ đâu, nhưng tạo ra khi đang bay trên dereferencing (như std::map::iterator).

Trả lời

14

Có, điều bạn muốn là có thể. Xin vui lòng, hãy nhìn vào boost/iterator_facade.hpp (ví dụ là cho Boost lib của phiên bản 1.49.0 nhưng nó là ok cho các bản phân phối mới của nó cũng):

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

Template luận Reference là chìa khóa. Bạn chỉ cần chỉ định Reference khi phát sinh từ boost::iterator_facade. Ví dụ: mã của bạn có thể trông giống như sau:

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

Cảm ơn bạn đã trả lời câu hỏi này, thực sự đã giúp tôi. Tôi có một câu hỏi mặc dù, trước khi xác định đối số mẫu tham khảo, tôi chỉ cố gắng trả về giá trị. Điều này được biên soạn nhưng đã cho tôi kết quả rất lạ, chẳng hạn như con trỏ trong lớp của tôi trở thành null vào thời điểm lạ. Tôi cho rằng câu hỏi của tôi là, tại sao nó lại biên dịch? – FlamFace

Các vấn đề liên quan