代码
下面每一行代码要是研究明白啊
下面是c++11
#include <tuple>
#include <iostream>template <size_t... S>
struct IndexSequence {}; template <size_t N, size_t... S>
struct IndexSequenceMaker : public IndexSequenceMaker<N - 1, N - 1, S...> {}; template <size_t... S>
struct IndexSequenceMaker<0, S...> {using Type = IndexSequence<S...>;
};template <size_t N>
using MakeIndexSequence = typename IndexSequenceMaker<N>::Type;template <typename T, typename F>
void ForEachTuple(T&& tuple, F&& consumer)
{ForEachTupleInternal(std::forward<T>(tuple), std::forward<F>(consumer), MakeIndexSequence<std::tuple_size<T>::value> {});
}template <typename T, typename F, size_t... S>
void ForEachTupleInternal(T&& tuple, F&& consumer, IndexSequence<S...>)
{std::initializer_list<int> { (consumer(std::get<S>(tuple)), 0)... };
}struct Consumer {template <typename T>void operator()(T&& value){ std::cout << value << std::endl;}
};int main(int argc, char* argv[])
{ForEachTuple(std::make_tuple(1, 2.1, "Hello"), Consumer {});return 0;
}
下面是c++14支持了序列生成
template <typename T, typename F>
void ForEachTuple(T&& tuple, F&& consumer)
{// c++ 14 的 make_index_sequenceForEachTupleInternal(std::forward<T>(tuple), std::forward<F>(consumer), std::make_index_sequence<std::tuple_size<T>::value> {});
}template <typename T, typename F, size_t... S>
void ForEachTupleInternal(T&& tuple, F&& consumer, std::index_sequence<S...>)
{std::initializer_list<int> { (consumer(std::get<S>(tuple)), 0)... };
}int main(int argc, char* argv[])
{// c++ 14 的 lambda 中 auto 作为参数ForEachTuple(std::make_tuple(1, 2.1, "Hello"), [](const auto& value) -> void { std::cout << value << std::endl; });return 0;
}