#include <tuple>
#include <iostream>
namespace details
{
template<typename Int, typename, Int Begin, bool Increasing>
struct integer_range_impl;
template<typename Int, Int... N, Int Begin>
struct integer_range_impl<Int, std::integer_sequence<Int, N...>, Begin, true> {
using type = std::integer_sequence<Int, N+Begin...>;
};
template<typename Int, Int... N, Int Begin>
struct integer_range_impl<Int, std::integer_sequence<Int, N...>, Begin, false> {
using type = std::integer_sequence<Int, Begin-N...>;
};
}
template<typename Int, Int Begin, Int End>
using integer_range = typename details::integer_range_impl<
Int,
std::make_integer_sequence<Int, (Begin<End) ? End-Begin : Begin-End>,
Begin,
(Begin<End) >::type;
template<std::size_t Begin, std::size_t End>
using index_range = integer_range<std::size_t, Begin, End>;
template<size_t N, class Tuple, class Func>
void tuple_call_assign(Tuple&& source, Tuple&& target, Func f)
{
std::get<N>(std::forward<Tuple>(target)) = f(std::get<N>(std::forward<Tuple>(source)));
}
template<size_t From, size_t To, class Tuple, class Func, size_t...Is>
void tuple_transform(Tuple&& source, Tuple&& target, Func f, std::index_sequence<Is...>)
{
using expander = int[];
(void)expander { 0, ((void)tuple_call_assign<Is>(source,target,f), 0)... };
}
template<size_t From, size_t To, class Tuple, class Func>
void tuple_transform(Tuple&& source, Tuple&& target, Func f)
{
tuple_transform<From,To>(std::forward<Tuple>(source), std::forward<Tuple>(target), f,
index_range<From,To>());
}
int main()
{
std::tuple<int,int,int> a = std::make_tuple(1,2,3);
std::tuple<int,int,int> b;
tuple_transform<0,3>(a,b,[](int a){return a*2;});
std::cout << std::get<0>(b);
std::cout << std::get<1>(b);
std::cout << std::get<2>(b);
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpuYW1lc3BhY2UgZGV0YWlscwp7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnQsIHR5cGVuYW1lLCBJbnQgQmVnaW4sIGJvb2wgSW5jcmVhc2luZz4KICAgIHN0cnVjdCBpbnRlZ2VyX3JhbmdlX2ltcGw7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgSW50LCBJbnQuLi4gTiwgSW50IEJlZ2luPgogICAgc3RydWN0IGludGVnZXJfcmFuZ2VfaW1wbDxJbnQsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxJbnQsIE4uLi4+LCBCZWdpbiwgdHJ1ZT4gewogICAgICAgIHVzaW5nIHR5cGUgPSBzdGQ6OmludGVnZXJfc2VxdWVuY2U8SW50LCBOK0JlZ2luLi4uPjsKICAgIH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgSW50LCBJbnQuLi4gTiwgSW50IEJlZ2luPgogICAgc3RydWN0IGludGVnZXJfcmFuZ2VfaW1wbDxJbnQsIHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxJbnQsIE4uLi4+LCBCZWdpbiwgZmFsc2U+IHsKICAgICAgICB1c2luZyB0eXBlID0gc3RkOjppbnRlZ2VyX3NlcXVlbmNlPEludCwgQmVnaW4tTi4uLj47CiAgICB9Owp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBJbnQsIEludCBCZWdpbiwgSW50IEVuZD4KdXNpbmcgaW50ZWdlcl9yYW5nZSA9IHR5cGVuYW1lIGRldGFpbHM6OmludGVnZXJfcmFuZ2VfaW1wbDwKICAgIEludCwKICAgIHN0ZDo6bWFrZV9pbnRlZ2VyX3NlcXVlbmNlPEludCwgKEJlZ2luPEVuZCkgPyBFbmQtQmVnaW4gOiBCZWdpbi1FbmQ+LAogICAgQmVnaW4sCiAgICAoQmVnaW48RW5kKSA+Ojp0eXBlOwoKdGVtcGxhdGU8c3RkOjpzaXplX3QgQmVnaW4sIHN0ZDo6c2l6ZV90IEVuZD4KdXNpbmcgaW5kZXhfcmFuZ2UgPSBpbnRlZ2VyX3JhbmdlPHN0ZDo6c2l6ZV90LCBCZWdpbiwgRW5kPjsKCnRlbXBsYXRlPHNpemVfdCBOLCBjbGFzcyBUdXBsZSwgY2xhc3MgRnVuYz4Kdm9pZCB0dXBsZV9jYWxsX2Fzc2lnbihUdXBsZSYmIHNvdXJjZSwgVHVwbGUmJiB0YXJnZXQsIEZ1bmMgZikKewogICAgc3RkOjpnZXQ8Tj4oc3RkOjpmb3J3YXJkPFR1cGxlPih0YXJnZXQpKSA9IGYoc3RkOjpnZXQ8Tj4oc3RkOjpmb3J3YXJkPFR1cGxlPihzb3VyY2UpKSk7CQp9Cgp0ZW1wbGF0ZTxzaXplX3QgRnJvbSwgc2l6ZV90IFRvLCBjbGFzcyBUdXBsZSwgY2xhc3MgRnVuYywgc2l6ZV90Li4uSXM+CnZvaWQgdHVwbGVfdHJhbnNmb3JtKFR1cGxlJiYgc291cmNlLCBUdXBsZSYmIHRhcmdldCwgRnVuYyBmLCBzdGQ6OmluZGV4X3NlcXVlbmNlPElzLi4uPikKewogICAgdXNpbmcgZXhwYW5kZXIgPSBpbnRbXTsKICAgICh2b2lkKWV4cGFuZGVyIHsgMCwgKCh2b2lkKXR1cGxlX2NhbGxfYXNzaWduPElzPihzb3VyY2UsdGFyZ2V0LGYpLCAwKS4uLiB9Owp9Cgp0ZW1wbGF0ZTxzaXplX3QgRnJvbSwgc2l6ZV90IFRvLCBjbGFzcyBUdXBsZSwgY2xhc3MgRnVuYz4Kdm9pZCB0dXBsZV90cmFuc2Zvcm0oVHVwbGUmJiBzb3VyY2UsIFR1cGxlJiYgdGFyZ2V0LCBGdW5jIGYpCnsKICAgIHR1cGxlX3RyYW5zZm9ybTxGcm9tLFRvPihzdGQ6OmZvcndhcmQ8VHVwbGU+KHNvdXJjZSksIHN0ZDo6Zm9yd2FyZDxUdXBsZT4odGFyZ2V0KSwgZiwKICAgICAgICAgICAgICAgICAgICBpbmRleF9yYW5nZTxGcm9tLFRvPigpKTsKfQoKCmludCBtYWluKCkKewoJc3RkOjp0dXBsZTxpbnQsaW50LGludD4gYSA9IHN0ZDo6bWFrZV90dXBsZSgxLDIsMyk7CglzdGQ6OnR1cGxlPGludCxpbnQsaW50PiBiOwoJdHVwbGVfdHJhbnNmb3JtPDAsMz4oYSxiLFtdKGludCBhKXtyZXR1cm4gYSoyO30pOwoJc3RkOjpjb3V0IDw8IHN0ZDo6Z2V0PDA+KGIpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6Z2V0PDE+KGIpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6Z2V0PDI+KGIpOwp9