2016-11-10 5 views
1

Ich habe versucht, Vorlage zu verwenden, um Code-Duplikation in der Implementierung eines const und nicht-Konst-Bereich über eine std::vector zu vermeiden.Implementierung const Bereich mit Vorlage

Die nicht-const-Version funktioniert, die const-Version jedoch nicht. Ich weiß nicht warum.

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

Antwort

3

std::vector::iterator wertet immer auf den Typ eines nicht const Iterator, da es ein typedef innerhalb std::vector definiert ist, die nicht wissen kann, wenn es auf einem const oder nicht const Beispiel genannt wird.

Sie müssen Ihren Iterator-Typ zwischen std::vector::iterator und std::vector::const_iterator bedingt auswählen. Beispiel:

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

on wandbox

Verwandte Themen