生成容器的成员类型

时间:2011-02-24 14:04:05

标签: c++ stl containers base-class boilerplate

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

    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>

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

  

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

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

答案 2 :(得分:0)

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

我希望本教程能够明确http://www.boost.org/doc/libs/1_46_0/libs/iterator/doc/iterator_facade.html#tutorial-example