4

当我定义自己的容器时,我必须提供十几种成员类型,例如:

    typedef T& reference;
    typedef const T& const_reference;
    typedef T* iterator;
    typedef const T* const_iterator;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef const T* const_pointer;
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

是否有我可以继承的基类模板,类似于std::iterator<T>我自己的迭代器?

4

3 回答 3

1

如果您需要经常这样做,那么我想您可以创建一个

template<typename T>
struct container
{
    typedef T& reference;
    typedef const T& const_reference;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef const T* const_pointer;
};

并由此继承。在标准库中,std::allocator确实定义了所有这些 typedef,因此从它继承在技术上会做你想要的,并且不应该强加任何运行时开销。不过,我仍然认为最好只编写自己的 typedef。

于 2011-02-24T14:33:56.810 回答
0

是否有我可以继承的基类模板,类似于std::iterator<T>我自己的迭代器?

不,但这是个好主意。OTOH,这会使从容器内引用这些类型变得更加困难,因为它们将是基类中的标识符,依赖于派生类的模板参数。这可能会令人讨厌。

于 2011-02-24T14:10:02.303 回答
0

有针对这种特定需求的 boost::iterator 。

我希望本教程能让事情变得清晰http://www.boost.org/doc/libs/1_46_0/libs/iterator/doc/iterator_facade.html#tutorial-example

于 2011-02-24T14:14:33.620 回答