至于“容器”类的实现,就更简单了:实现begin()和end()方法,并返回上面的FakeIter就好了。类中的方法加了一些cout语句,可以更清楚的了解循环执行时具体方法的调用过程,实际用时可以删掉。
class Range
{
typedef long _VType; //同样,也可以弄个模板出来,但是就不方便用了
public:
Range (_VType begin_v, _VType end_v)
:begin_value_(begin_v), end_value_(end_v)
{
cout<<"Range::Range()"<<endl;
}
~Range()
{
cout<<"Range::~Range()"<<endl;
}
FakeIter begin () const
{
cout<<"Range::begin()"<<endl;
return FakeIter(begin_value_);
}
FakeIter end () const
{
cout<<"Range::end()"<<endl;
return FakeIter(end_value_ );
}
private:
_VType begin_value_;
_VType end_value_;
};
好了,试试看这货有没用:
for (auto x: Range(1,5))
{
std::cout<<x<<endl;
}
std::cout<<"Loop end"<<endl;
在vs2012及clang下输出如下:
Range::Range()
Range::begin()
Range::end()
1
2
3
4
Range::~Range()
Loop end
嗯,如果把那些影响视线的输出语句的注释掉的话貌似能用了。现在要遍历一个new生成的数组的话,只需用这东西Range个下标,世界就清静了。
但是,步长呢!好吧,貌似我暂时还没这方面的需求。不过实现起来也很简单:修改FakeIter类就可以了,可以增加一个表示步长的成员,然后再修改自加操作。更进一步,也可以加一个生成器方法,就能变成一个更通用的生成器了。配合C++11 lambda操作符,用起来也挺方便。
以上就是小编为大家带来的C++11的for循环,以及范围Range类的简单实现全部内容了,希望大家多多支持ASPKU~
注:相关教程知识阅读请移步到C++教程频道。










