I have created a little generator class to generate number sequences.The intended purpose of this class is to be used with generate_n to populate containers. I would like to know whether there is something which i can do to improve performance or usability or to make the code more generic. It should be possible to compile the code with a c++14 conformant compiler at the moment, but i am open to use any number of c++17 features. My generator class:
#include <functional>
template<typename Number,
typename AdvanceOperation = std::plus<Number>>
class sequence_generator
{
public:
constexpr sequence_generator(Number start_value = Number{},
Number step_size = Number{1},
AdvanceOperation advancer = AdvanceOperation{})
: current_value{start_value},
step_size{step_size},
advancer{advancer}
{}
constexpr auto operator()() -> Number
{
return next();
}
constexpr auto next() -> Number
{
auto tmp = current_value;
current_value = advancer(current_value, step_size);
return tmp;
}
private:
Number current_value;
Number step_size;
AdvanceOperation advancer;
};
template<typename Number, typename AdvanceOperation=std::plus<Number>>
auto make_sequence_generator(Number start_value, Number step_size,
AdvanceOperation advancer)
{
return sequence_generator<Number, AdvanceOperation>{start_value, step_size,
advancer};
}
Some use cases:
#include <algorithm>
#include <iostream>
#include <vector>
#include <cassert>
#include "generator.hpp"
int main()
{
std::vector<int> vector(10);
std::generate(std::begin(vector), std::end(vector),
sequence_generator<int>{});
assert(vector == std::vector<int>({0,1,2,3,4,5,6,7,8,9}));
std::generate(std::begin(vector), std::end(vector),
make_sequence_generator(1,2,std::multiplies<>{}));
assert(vector == std::vector<int>({1,2,4,8,16,32,64,128,256,512}));
}
std::iota? I think it has nice interface. \$\endgroup\$std::iotais a great example, although with limited functionality. \$\endgroup\$