Now that we have the foundation functions, the iterator and its corresponding type_traits, the range class, and the make_linear_range convenience function, we can use them to iterate a range of numbers as simple as this:
for(auto t: make_linear_range(0.0, 1.0, 4)) { std::cout << t << ", "; }// Output: 0, 0.33, 0.66, 1.0,
What happens here is that the make_linear_range function returns a LinearRange class. When a range-based for-loop is invoked, the compiler internally generates code that looks similar to this:
auto r = make_linear_range(0.0, 1.0, 4); // r is a LinearRange<double>auto first = r.begin(); // first is a LinearRangeIterator<double>auto last = r.end(); // last is a LinearRangeIterator<double>for(auto ...