cpp 自定义range for

194 阅读1分钟

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;
}

输出如图

img.png