c++ - 使用模板实现 const 范围

标签 c++ templates iterator

std::vector 上实现 const 和非常量范围时,我尝试使用模板来避免代码重复。

非 const 版本有效,但 const 版本无效。我不知道为什么。

测试.cpp。用g++ test.cpp编译:

#include <vector>
#include <iostream>
enum Cv {
    constant,
    non_constant
};

template <typename T, typename Index, Cv Cv_enum>
class Vector_range_facade {
    typedef typename std::conditional <
            Cv_enum == Cv::constant,
                    const std::vector<T>, std::vector<T>
    >::type Vec;
public:
    typedef typename Vec::iterator Iterator;
    Vector_range_facade(Vec& vec, const Index start_id, const Index size)
            : vec_{vec},
              it_begin_{vec_.begin() + start_id},
              it_end_  {vec_.begin() + start_id + size}
    {}  
    Iterator& begin() {return it_begin_;}
    Iterator& end()   {return it_end_;}
private:
    Vec& vec_;
    Iterator it_begin_;
    Iterator it_end_;
};

int main()
{
    std::vector<int> a;
    a.resize(100);
    Vector_range_facade<int, int, Cv::constant> range(a,0,10);
    for (auto x : range) {
        std::cout << x <<"\n";
    }   
}

最佳答案

std::vector::iterator 始终计算为非 const 迭代器的类型,因为它是内部定义的 typedef std::vector 不知道它是在 const 还是非 const 实例上被调用。

您需要在 std::vector::iteratorstd::vector::const_iterator 之间有条件地选择迭代器类型。示例:

typedef typename std::conditional <
        Cv_enum == Cv::constant,
        typename std::vector<T>::const_iterator, 
        typename std::vector<T>::iterator
>::type Iterator;

on wandbox

关于c++ - 使用模板实现 const 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40532488/

相关文章:

c++ - 当分配值的类型可以容纳它时,为什么根据数据类型计算会发生溢出

c++ - Delphi XE - 无法从系统菜单中删除项目

javascript - JQuery 模板 : How to preserve backslashes in content?

c++ - 我正在尝试使用 vector 迭代器创建一个 for 循环

java - Guava 库中的 Iterators.any

c++ - 最小(最大)处理器状态 API,C++

c++ - decltype 应该如何与运算符一起工作,

c++ - 确保 C++ 类具有某些成员函数

C++使用子类从模板继承

c++ - STL 迭代器的语法是如何实现的?