#include <vector>
#include <tuple>
#include <type_traits>
template <typename... T>
struct transpose {};
template <typename... T>
struct transpose<std::tuple<std::vector<T>...>>
{
using type = std::vector<std::tuple<T...>>;
};
template <typename... T>
struct transpose<std::vector<std::tuple<T...>>>
{
using type = std::tuple<std::vector<T>...>;
};
template <int... Is>
struct seq {};
template <int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> {};
template <int... Is>
struct gen_seq<0, Is...> : seq<Is...> {};
template <typename... T, int... Is>
auto tuple_transpose(std::tuple<std::vector<T>...>& var, seq<Is...>) -> typename transpose<decltype(var)>::type
{
return { std::make_tuple(std::get<Is>(var)...) };
}
template <typename... T>
auto tuple_transpose(std::tuple<std::vector<T>...>& var) -> typename transpose<decltype(var)>::type
{
return tuple_transpose(var, gen_seq<sizeof...(T)>{});
}
int main()
{
std::tuple<std::vector<int>, std::vector<bool>> var;
tuple_transpose(var);
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4Kc3RydWN0IHRyYW5zcG9zZSB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgpzdHJ1Y3QgdHJhbnNwb3NlPHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8VD4uLi4+Pgp7CiAgICB1c2luZyB0eXBlID0gc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxULi4uPj47Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4Kc3RydWN0IHRyYW5zcG9zZTxzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPFQuLi4+Pj4KewogICAgdXNpbmcgdHlwZSA9IHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8VD4uLi4+Owp9OwoKdGVtcGxhdGUgPGludC4uLiBJcz4Kc3RydWN0IHNlcSB7fTsKCnRlbXBsYXRlIDxpbnQgTiwgaW50Li4uIElzPgpzdHJ1Y3QgZ2VuX3NlcSA6IGdlbl9zZXE8TiAtIDEsIE4gLSAxLCBJcy4uLj4ge307Cgp0ZW1wbGF0ZSA8aW50Li4uIElzPgpzdHJ1Y3QgZ2VuX3NlcTwwLCBJcy4uLj4gOiBzZXE8SXMuLi4+IHt9OyAKCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBULCBpbnQuLi4gSXM+CmF1dG8gdHVwbGVfdHJhbnNwb3NlKHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8VD4uLi4+JiB2YXIsIHNlcTxJcy4uLj4pIC0+IHR5cGVuYW1lIHRyYW5zcG9zZTxkZWNsdHlwZSh2YXIpPjo6dHlwZQp7CiAgICByZXR1cm4geyBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8SXM+KHZhcikuLi4pIH07Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgphdXRvIHR1cGxlX3RyYW5zcG9zZShzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPFQ+Li4uPiYgdmFyKSAtPiB0eXBlbmFtZSB0cmFuc3Bvc2U8ZGVjbHR5cGUodmFyKT46OnR5cGUKewogICAgcmV0dXJuIHR1cGxlX3RyYW5zcG9zZSh2YXIsIGdlbl9zZXE8c2l6ZW9mLi4uKFQpPnt9KTsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnR1cGxlPHN0ZDo6dmVjdG9yPGludD4sIHN0ZDo6dmVjdG9yPGJvb2w+PiB2YXI7CiAgICB0dXBsZV90cmFuc3Bvc2UodmFyKTsKCiAgICAKfQ==
prog.cpp: In function ‘int main()’:
prog.cpp:44:24: error: no matching function for call to ‘tuple_transpose(std::tuple<std::vector<int, std::allocator<int> >, std::vector<bool, std::allocator<bool> > >&)’
prog.cpp:44:24: note: candidates are:
prog.cpp:30:6: note: template<class ... T, int ...Is> typename transpose<decltype (var)>::type tuple_transpose(std::tuple<std::vector<T, std::allocator<T> >...>&, seq<Is ...>)
prog.cpp:30:6: note: template argument deduction/substitution failed:
prog.cpp:44:24: note: candidate expects 2 arguments, 1 provided
prog.cpp:36:6: note: template<class ... T> typename transpose<decltype (var)>::type tuple_transpose(std::tuple<std::vector<T, std::allocator<T> >...>&)
prog.cpp:36:6: note: template argument deduction/substitution failed:
prog.cpp: In substitution of ‘template<class ... T> typename transpose<decltype (var)>::type tuple_transpose(std::tuple<std::vector<T, std::allocator<T> >...>&) [with T = {int, bool}]’:
prog.cpp:44:24: required from here
prog.cpp:36:6: error: no type named ‘type’ in ‘struct transpose<std::tuple<std::vector<int, std::allocator<int> >, std::vector<bool, std::allocator<bool> > >&>’