2013-07-12 31 views
5

Tôi có một vùng chứa chịu trách nhiệm quản lý một tập các thuộc tính. Lớp học trông giống như thế này:Bộ điều hợp dereference cho bộ lặp của con trỏ

class AttributeSet 
{ 
public: 
    // ... interface is irrelevant for my question. 

private: 
    std::vector<boost::shared_ptr<Attribute> > m_attributes; 
}; 

Thuộc tính đa hình nên các thuộc tính phải được lưu trữ làm con trỏ tuy nhiên chúng không bao giờ có thể là NULL.

Tôi muốn sử dụng lớp này với BOOST_FOREACH, như thế này:

BOOST_FOREACH(const Attribute &attribute, attributeSet) 
{ 
    ... 
} 

Theo tài liệu BOOST_FOREACH,

Sự hỗ trợ cho STL container là rất chung chung; bất cứ thứ gì trông giống như số lượng container STL. Nếu nó có các biến lặp và các kiểu const_iterator và các hàm thành viên start() và end(), BOOST_FOREACH sẽ tự động biết cách lặp lại nó.

Vì vậy, tôi cập nhật lớp học của tôi để tìm một cái gì đó như thế này:

class AttributeSet 
{ 
public: 
    typedef std::vector<boost::shared_ptr<Attribute> > container; 
    typedef container::iterator iterator; 
    typedef container::const_iterator const_iterator; 

    iterator begin(); 
    iterator end(); 

    const_iterator begin() const; 
    const_iterator end() const; 

private: 
    container m_attributes; 
}; 

Vì vậy, bây giờ tôi có thể làm điều này:

BOOST_FOREACH(const boost::shared_ptr<Attribute> &attribute, attributeSet) 
{ 
    ... 
} 

này là tốt đẹp tuy nhiên tôi không thích nó phơi bày các thuộc tính như con trỏ. Từ phía người gọi, đây là tiếng ồn và sẽ tạo ra các kiểm tra NULL vô nghĩa.

Tôi có một vài ý tưởng về cách khắc phục sự cố. Ví dụ: một cái gì đó như thế này sẽ đẹp:

class AttributeSet 
{ 
public: 
    typedef std::vector<boost::shared_ptr<Attribute> > container; 
    typedef iterator_dereference_adapter<container::iterator> iterator; 
    typedef iterator_dereference_adapter<container::const_iterator> const_iterator; 

    iterator begin() { return iterator(m_attributes.begin()); } 
    iterator end() { return iterator(m_attributes.end()); } 

    const_iterator begin() const { return const_iterator(m_attributes.begin()); } 
    const_iterator end() const { return const_iterator(m_attributes.end()); } 

private: 
    container m_attributes; 
}; 

Lớp 'iterator_dereference_adapter' có phần tự giải thích. Nó sẽ quấn một iterator hiện tại của con trỏ và dereference các giá trị con trỏ.

Vì vậy, cuối cùng, câu hỏi của tôi ...

Trước khi tôi đi ra và cố gắng để viết bộ chuyển đổi này, là có cái gì đó trong STL hoặc Boost như lớp này?

Tôi đang mở cho các ý tưởng khác.

+5

Tăng có [trình lặp gián tiếp] (http://www.boost.org/doc/libs/1_54_0/libs/iterator/doc/indirect_iterator.html). –

+0

Câu hỏi hay. +1. –

Trả lời

7

Tăng cường có indirect_iterator được đưa vào chính xác để gói một trình lặp đến loại con trỏ và tự động dereferencing.

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