fork download
  1. #include <functional>
  2.  
  3. template<typename Number,
  4. typename AdvanceOperation = std::plus<Number>>
  5. class sequence_generator
  6. {
  7. public:
  8. sequence_generator(Number start_value = Number{},
  9. Number step_size = Number{1},
  10. AdvanceOperation advancer = AdvanceOperation{})
  11. : current_value{start_value},
  12. step_size{step_size},
  13. advancer{advancer}
  14. {}
  15.  
  16. auto operator()()
  17. {
  18. return next();
  19. }
  20.  
  21. auto next()
  22. {
  23. auto tmp = current_value;
  24. current_value = advancer(current_value, step_size);
  25. return tmp;
  26. }
  27. private:
  28. Number current_value;
  29. Number step_size;
  30. AdvanceOperation advancer;
  31. };
  32.  
  33. template<typename Number, typename AdvanceOperation=std::plus<Number>>
  34. auto make_sequence_generator(Number start_value, Number step_size,
  35. AdvanceOperation advancer)
  36. {
  37. return sequence_generator<Number, AdvanceOperation>{start_value, step_size,
  38. advancer};
  39. }
  40.  
  41. #include <algorithm>
  42. #include <iostream>
  43. #include <vector>
  44. #include <cassert>
  45.  
  46. int main()
  47. {
  48. std::vector<int> vector(10);
  49. std::generate(std::begin(vector), std::end(vector),
  50. sequence_generator<int>{});
  51. assert(vector == std::vector<int>({0,1,2,3,4,5,6,7,8,9}));
  52. std::generate(std::begin(vector), std::end(vector),
  53. make_sequence_generator(1,2,std::multiplies<>{}));
  54. assert(vector == std::vector<int>({1,2,4,8,16,32,64,128,256,512}));
  55. }
Success #stdin #stdout 0s 3408KB
stdin
Standard input is empty
stdout
Standard output is empty