c++ 的
for( auto x : range) { code_block;}
其实是一个语法糖,大概长这样
{
auto __begin = std::begin(range);
auto __end = std::end(range);
for(; __begin != __end; ++__begin){
auto x = *__begin;
code_block
}
}
这就意味着,如果你实现一个类。需要实现 begin() /end() 返回一个iterator 这个iterator 需要实现 operator != 不等 /operator ++ 前置自增 / operator *取值就可以使用range for了
class NumIterator{
int i;
public:
explicit NumIterator(int _i):i(_i){}
int operator *()const{
return i;
}
NumIterator& operator ++(){
++i;
return *this;
}
bool operator !=(const NumIterator &rhs)const{
return i != rhs.i;
}
};
class NumRange{
private:
int iBegin;
int iEnd;
public:
NumRange(int from ,int to):iBegin(from),iEnd(to){}
NumIterator begin()const { return NumIterator(iBegin); }
NumIterator end()const { return NumIterator(iEnd); }
};
int main(){
for ( auto i : NumRange{10,20} ){
cout << i << ",";
}
cout << endl;
return 0;
}
输出如图