January 2018
Intermediate to advanced
374 pages
9h 53m
English
Even though the previous example works, it is quite bloated as we need to duplicate the start and step length values. A more generalized solution is to let the range mimic a container, where begin() and end() correspond to the start and stop iterators:
template <typename T>class LinearRange { using iterator = LinearRangeIterator<T>;public: LinearRange(T start, T stop, size_t num_values) : start_{start} , step_size_{get_step_size(start, stop, num_values)} , num_values_{num_values} {} auto begin()const{ return iterator{start_, step_size_, 0}; } auto end()const{ return iterator{start_, step_size_, num_values_}; }private: T start_{}; T step_size_{}; size_t num_values_{};};