C++ 在C+中创建迭代器时派生行为的基类+;11

C++ 在C+中创建迭代器时派生行为的基类+;11,c++,c++11,C++,C++11,我正在实现一个迭代器,用于我编写的类。我想要的行为与std::vector::const_迭代器一样,除了构造函数,递增和递减,即迭代器是(不可变的,即不是输出迭代器)随机访问迭代器 我真的不想在迭代器上定义与它使用的std::vector::const_迭代器相同的所有操作。我更喜欢从已经具有所有这些行为的类派生,但是,由于std::vector::const_迭代器没有虚拟析构函数,并且通过继承派生将允许转换回std::vector::const_迭代器,因此不适合仅让我的迭代器从它继承 是

我正在实现一个迭代器,用于我编写的类。我想要的行为与
std::vector::const_迭代器
一样,除了构造函数,递增和递减,即迭代器是(不可变的,即不是
输出迭代器
随机访问迭代器

我真的不想在迭代器上定义与它使用的
std::vector::const_迭代器相同的所有操作。我更喜欢从已经具有所有这些行为的类派生,但是,由于
std::vector::const_迭代器
没有虚拟析构函数,并且通过继承派生将允许转换回
std::vector::const_迭代器
,因此不适合仅让我的迭代器从它继承

是否定义了一个模板(理想情况下在标准库中),该模板将
RandomAccessIterator
作为模板参数,并通过在传递给构造函数的私有成员上调用它们,为
RandomAccessIterator
所需的所有操作提供虚拟成员函数(即,它通过组合而不是继承从其模板参数派生所有的
RandomAccessIterator
操作)

为了澄清,我希望能够写一些

template<class value_type>
class myIterator : public random_access_iterator<std::vector<value_type>::const_iterator>
{
    myIterator(..., std::vector<value_type>::const_iterator base_iterator)
        : random_access_iterator(base_iterator) { ... }
    myIterator& operator++ () derived;
    myIterator& operator++ (int) derived;
    myIterator& operator-- () derived;
    myIterator& operator-- (int) derived;
    myIterator(const myIterator&) = default;
    myIterator(myIterator&&) = default;
    myIterator& operator=(const myIterator&) = default;
    myIterator& operator=(myIterator&&) = default;
};
模板
类myIterator:公共随机访问迭代器
{
myIterator(…,std::vector::const_iterator base_iterator)
:随机存取迭代器(基迭代器){…}
myIterator&运算符++()派生;
myIterator&运算符++(int)派生;
myIterator&运算符--()派生;
myIterator和运算符--(int)派生;
myIterator(constmyiterator&)=默认值;
myIterator(myIterator&&)=默认值;
myIterator&运算符=(常量myIterator&)=默认值;
myIterator&运算符=(myIterator&&)=默认值;
};

但是,我不知道本例中的
随机访问迭代器
模板是否存在,或者,如果存在,它的名称是什么。

标准中没有这样的模板

boost
提供了一些帮助生成迭代器的工具

通常,您应该至少实现一次自己的迭代器,然后将其丢弃,并尽可能使用
boost
解决方案

boost
“迭代器”fascade
使用CRTP从派生类型和基类型中提取行为,并为您执行一系列样板工作。
iterator\u adapter
如果您正在修改现有迭代器,可能会很有用


在依赖
boost
实现之前,编写一个基本的CRTP迭代器助手是一个好主意,因为它具有教育意义。

可能类似于boost的
iterator\u facade
?请看一看boost。谢谢。标准库中还没有一个,这似乎很遗憾。在这种情况下,我宁愿不使用boost,因为它增加了更多的麻烦和更多的依赖,在目前实际上只是一个小程序,所以,我要写我自己的,至少现在,使用它(但是,如果应用程序扩展并依赖于在其他地方使用boost,或者在其他地方有一个非平凡的依赖关系,我将用boost iterator_adapter替换它,一般来说,我将在将来使用它,除非有充分的理由不这样做)。