当我定义自己的容器时,我必须提供十几种成员类型,例如:
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>
?
答案 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