2016-11-10 4 views
1

std::vectorを超えるconstとnon-const範囲の実装でコードの重複を避けるためにテンプレートを使用しようとしました。テンプレートでconst範囲を実装する

非constバージョンは機能しますが、constバージョンは機能しません。どうしてか分かりません。

test.cpp。 g++ test.cppをコンパイルします。それはconstまたは非constインスタンス上で呼び出されていているかどうかを知ることができないstd::vector内で定義さtypedefあるよう

#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::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

関連する問題