Give access to encapsulated container

后端 未结 6 1266
借酒劲吻你
借酒劲吻你 2021-01-13 02:38
class X {
  public:
    typedef std::list Container;

    // (1)
    const Container& GetElements() const;

    // (2)
    Container::iterator Element         


        
6条回答
  •  Happy的楠姐
    2021-01-13 03:16

    If you can use Boost, there is a library for you: http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/index.html Specifically look at iterator_facade and iterator_adapter

    Here is an example of what to do - It provides an std::vector holder, with STL compatible iterators. You can extend it by adding other methods, like operator[], size(), push_back() etc.

    template class VectorHolder { public: typedef T value_type;

    public: VectorHolder() : m_values() { }

    public: typedef typename std::vector::iterator vector_iterator; typedef typename std::vector::const_iterator vector_const_iterator;

    class iterator : public boost::iterator_adaptor
    {
    public:
        iterator()
            : iterator::iterator_adaptor_()
        {
        }
    
        iterator(const vector_iterator& it)
            : iterator::iterator_adaptor_(it)
        {
        }
    
    private:
        friend class boost::iterator_core_access;
    };
    
    class const_iterator : public boost::iterator_adaptor
    {
    public:
        const_iterator()
            : const_iterator::iterator_adaptor_()
        {
        }
    
        const_iterator(const vector_const_iterator& it)
            : const_iterator::iterator_adaptor_(it)
        {
        }
    
        const_iterator(const iterator& it)
            : const_iterator::iterator_adaptor_(it.base())
        {
        }
    private:
        friend class boost::iterator_core_access;
    };
    
    
    iterator begin()
    {
        return iterator(m_values.begin());
    }
    
    iterator end()
    {
        return iterator(m_values.end());
    }
    
    const_iterator begin() const
    {
        return const_iterator(m_values.begin());
    }
    
    const_iterator end() const
    {
        return const_iterator(m_values.end());
    }protected:
    std::vector m_values;};
    

提交回复
热议问题