std::tupleの反復処理

std::tupleで反復処理をさせる方法

#include <tuple>
#include <string>
#include <iostream>
#include <utility>

template <class Value>
void print_value(std::ostream& stream, std::size_t index, const Value& value){
  stream << "index(" << index << ") " << value << std::endl;
}

template <class Tuple, std::size_t... Index>
void print_tuple_impl(const Tuple& tuple, std::index_sequence<Index...>) {
  (print_value(std::cout,Index, std::get<Index>(tuple)), ...);
}

template <class Tuple, std::size_t TupleSize = std::tuple_size_v<Tuple>>
void print_tuple(const Tuple& tuple) {
  print_tuple_impl(tuple, std::make_index_sequence<TupleSize>());
}

int main() {
  std::tuple<int, int, int, std::string> value { 1, 2, 3, "end" };

  print_tuple(value);
  return 0;
}

std::make_index_sequence とか知らなかってなぁというのとfold expression なんかはすっかり忘れてた。。。