使用C++实现一个range, 功能如下:
int main()
{
int cases = 0;
cout << "#Case " << ++cases << ": range(15): \n\t";
for(auto x : range(15)) cout << x << " ";
cout << endl;
cout << "#Case " << ++cases << ": range(2, 6): \n\t";
for(auto x : range(2, 6)) cout << x << " ";
cout << endl;
cout << "#Case " << ++cases << ": range(2, 6, 3): \n\t";
for(auto x : range(2, 6, 3)) cout << x << " ";
cout << endl;
cout << "#Case " << ++cases << ": range(10.5, 15.5): \n\t";
for(auto x : range(10.5, 15.5)) cout << x << " ";
cout << endl;
cout << "#Case " << ++cases << ": range(35, 27, -1.5): \n\t";
for(auto x : range(35, 27, -1.5)) cout << x << " ";
cout << endl;
cout << "#Case " << ++cases << ": range('a', 'z'): \n\t";
for(char x : range('a', 'z')) cout << x << " ";
cout << endl;
}
实现代码如下:
template <class T>
class Range
{
private:
T mBegin;
T mEnd;
T mStep;
int mSize;
class Iterator
{
private:
T mCurrentValue;
Range& mRange;
int mCurrentStep;
public:
Iterator(int start, Range& range) : mCurrentStep(start), mRange(range)
{
mCurrentValue = mRange.mBegin + mCurrentStep * mRange.mStep;
}
T operator * ()
{
return mCurrentValue;
}
bool operator != (const Iterator &another)
{
return mCurrentStep != another.mCurrentStep;
}
const Iterator* operator++()
{
mCurrentValue += mRange.mStep;
mCurrentStep++;
return this;
}
};
public:
Range(T begin, T end, T step = 1) : mBegin(begin), mEnd(end), mStep(step)
{
if(step > 0 && mBegin >= mEnd)
throw std::logic_error("end must greater than begin.");
else if(step < 0 && mBegin <= mEnd)
throw std::logic_error("end must less than begin.");
mSize = (mEnd - mBegin) / mStep;
if(mBegin + mSize * mStep != mEnd)
{
mSize++;
}
};
Iterator begin()
{
return Iterator(0, *this);
}
Iterator end()
{
return Iterator(mSize, *this);
}
};
template <typename T, typename U = int>
auto range(T begin, T end, U step = 1)->Range<decltype(begin+step)>
{
return Range<decltype(begin+step)>(begin, end, step);
};
template <typename T>
Range<T> range(T end)
{
return Range<T>(0, end, 1);
};