我尝试使用模板来避免在std::vector
上实现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";
}
}
答案 0 :(得分:3)
std::vector::iterator
始终评估非const
迭代器的类型,因为它是typedef
内定义的std::vector
,无法知道它是否正在调用了const
或非const
实例。
您需要在std::vector::iterator
和std::vector::const_iterator
之间有条件地选择迭代器类型。例如:
typedef typename std::conditional <
Cv_enum == Cv::constant,
typename std::vector<T>::const_iterator,
typename std::vector<T>::iterator
>::type Iterator;