fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <tuple>
  4. #include <array>
  5.  
  6. template <std::size_t N>
  7. bool increase(const std::array<std::size_t, N>& sizes, std::array<std::size_t, N>& it)
  8. {
  9. for (std::size_t i = 0; i != N; ++i) {
  10. const std::size_t index = N - 1 - i;
  11. ++it[index];
  12. if (it[index] >= sizes[index]) {
  13. it[index] = 0;
  14. } else {
  15. return true;
  16. }
  17. }
  18. return false;
  19. }
  20.  
  21. template <typename F, std::size_t ... Is, std::size_t N, typename Tuple>
  22. void apply_impl(F&& f,
  23. std::index_sequence<Is...>,
  24. const std::array<std::size_t, N>& it,
  25. const Tuple& tuple)
  26. {
  27. f(std::get<Is>(tuple)[it[Is]]...);
  28. }
  29.  
  30. template <typename F, typename ... Ts>
  31. void iterate(F&& f, const std::vector<Ts>&... vs)
  32. {
  33. constexpr std::size_t N = sizeof...(Ts);
  34. std::array<std::size_t, N> sizes{{vs.size()...}};
  35. std::array<std::size_t, N> it{{(vs.size(), 0u)...}};
  36.  
  37. do {
  38. apply_impl(f, std::index_sequence_for<Ts...>(), it, std::tie(vs...));
  39. } while (increase(sizes, it));
  40. }
  41.  
  42. void do_job(int a, const std::string& s, int b)
  43. {
  44. std::cout << a << s << b << std::endl;
  45. }
  46.  
  47.  
  48. int main()
  49. {
  50. std::vector<int> v1 = {1, 2, 3};
  51. std::vector<std::string> v2 = {" A "," B "};
  52. std::vector<int> v3 = {4, 5};
  53. iterate(do_job, v1, v2, v3);
  54. }
Success #stdin #stdout 0s 4472KB
stdin
Standard input is empty
stdout
1 A 4
1 A 5
1 B 4
1 B 5
2 A 4
2 A 5
2 B 4
2 B 5
3 A 4
3 A 5
3 B 4
3 B 5