2016-11-10 53 views
1

我试图使用模板来避免在std::vector上执行const和非const范围时的代码重复。使用模板实现const范围

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

test.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"; 
    } 
} 

回答

3

std::vector::iterator始终计算为一个非const迭代器的类型,因为它是内部std::vector定义的typedef无法知道,如果它被称为上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