#include <utility>
#include <tuple>
#include <iostream>
template <std::size_t I, typename F, typename ...Tuples>
constexpr F for_each_tuple_variadic_impl2(F&& f, Tuples&& ...tuples)
{
return std::forward<F>(f)((std::get<I>(std::forward<Tuples>(tuples)))...), f;
}
template <typename F, std::size_t... I, typename ...Tuples>
constexpr F for_each_tuple_variadic_impl(F&& f, std::index_sequence<I...>, Tuples&& ...tuples)
{
return (for_each_tuple_variadic_impl2<I>(std::forward<F>(f), std::forward<Tuples>(tuples)...), ...), f;
}
template<typename Tuple1, typename... OtherTuples >
struct tuple_size_helper
{
static const std::size_t value = std::tuple_size<std::remove_reference_t<Tuple1>>::value;
};
template <typename F, typename ...Tuples>
constexpr F for_each_variadic(F&& f, Tuples&& ...tuples)
{
return for_each_tuple_variadic_impl(
std::forward<F>(f),
std::make_index_sequence<tuple_size_helper<Tuples...>::value>{},
std::forward<Tuples>(tuples)...);
}
int main()
{
for_each_variadic([](auto a1, auto a2, auto a3){
std::cout<<a1<<", "<<a2<<", "<<a3<<std::endl;
}, std::make_tuple(1,'c'), std::make_tuple("str",220), std::make_tuple(1.5,380));
return 0;
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBJLCB0eXBlbmFtZSBGLCB0eXBlbmFtZSAuLi5UdXBsZXM+CmNvbnN0ZXhwciBGIGZvcl9lYWNoX3R1cGxlX3ZhcmlhZGljX2ltcGwyKEYmJiBmLCBUdXBsZXMmJiAuLi50dXBsZXMpCnsKICAgIHJldHVybiBzdGQ6OmZvcndhcmQ8Rj4oZikoKHN0ZDo6Z2V0PEk+KHN0ZDo6Zm9yd2FyZDxUdXBsZXM+KHR1cGxlcykpKS4uLiksIGY7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCBzdGQ6OnNpemVfdC4uLiBJLCB0eXBlbmFtZSAuLi5UdXBsZXM+CmNvbnN0ZXhwciBGIGZvcl9lYWNoX3R1cGxlX3ZhcmlhZGljX2ltcGwoRiYmIGYsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8SS4uLj4sIFR1cGxlcyYmIC4uLnR1cGxlcykKewogICAgcmV0dXJuIChmb3JfZWFjaF90dXBsZV92YXJpYWRpY19pbXBsMjxJPihzdGQ6OmZvcndhcmQ8Rj4oZiksIHN0ZDo6Zm9yd2FyZDxUdXBsZXM+KHR1cGxlcykuLi4pLCAuLi4pLCBmOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUdXBsZTEsIHR5cGVuYW1lLi4uIE90aGVyVHVwbGVzID4gCnN0cnVjdCB0dXBsZV9zaXplX2hlbHBlcgp7CiAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IHZhbHVlID0gc3RkOjp0dXBsZV9zaXplPHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZV90PFR1cGxlMT4+Ojp2YWx1ZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZSAuLi5UdXBsZXM+CmNvbnN0ZXhwciBGIGZvcl9lYWNoX3ZhcmlhZGljKEYmJiBmLCBUdXBsZXMmJiAuLi50dXBsZXMpCnsKICAgIHJldHVybiBmb3JfZWFjaF90dXBsZV92YXJpYWRpY19pbXBsKAogICAgICAgICAgICBzdGQ6OmZvcndhcmQ8Rj4oZiksCiAgICAgICAgICAgIHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5jZTx0dXBsZV9zaXplX2hlbHBlcjxUdXBsZXMuLi4+Ojp2YWx1ZT57fSwKICAgICAgICAgICAgc3RkOjpmb3J3YXJkPFR1cGxlcz4odHVwbGVzKS4uLik7Cn0KCmludCBtYWluKCkKewoJZm9yX2VhY2hfdmFyaWFkaWMoW10oYXV0byBhMSwgYXV0byBhMiwgYXV0byBhMyl7CgkJc3RkOjpjb3V0PDxhMTw8IiwgIjw8YTI8PCIsICI8PGEzPDxzdGQ6OmVuZGw7Cgl9LCBzdGQ6Om1ha2VfdHVwbGUoMSwnYycpLCBzdGQ6Om1ha2VfdHVwbGUoInN0ciIsMjIwKSwgc3RkOjptYWtlX3R1cGxlKDEuNSwzODApKTsKCXJldHVybiAwOwp9