#include <vector>
#include <tuple>
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 transpose(std::tuple<std::vector<T>...>& var, seq<Is...>)
-> std::vector<std::tuple<T...>>
{
std::vector<std::tuple<T...>> result;
for (std::size_t i = 0; i < std::get<0>(var).size(); i++)
{
std::tuple<T...> t = std::make_tuple(std::get<Is>(var)[i]...);
result.push_back(t);
}
return result;
}
template <typename... T, int... Is>
auto transpose(std::tuple<std::vector<T>...>& var)
-> std::vector<std::tuple<T...>>
{
return transpose(var, gen_seq<sizeof...(T)>());
}
#include <iostream>
#include <iomanip>
int main()
{
std::vector<int> vi = {42, 1729, 6};
std::vector<bool> vb = {true, false, false};
std::vector<std::string> vs = {"Hi", "Hey", "Ho"};
auto t = make_tuple(vi, vb, vs);
auto v = transpose(t);
std::cout << std::boolalpha;
for (auto const& t : v)
{
std::cout << "(";
std::cout << std::get<0>(t);
std::cout << ", " << std::get<1>(t);
std::cout << ", " << std::get<2>(t);
std::cout << ")" << std::endl;
}
}
ICAgICNpbmNsdWRlIDx2ZWN0b3I+CiAgICAjaW5jbHVkZSA8dHVwbGU+CgogICAgdGVtcGxhdGUgPGludC4uLiBJcz4KICAgIHN0cnVjdCBzZXEge307CgogICAgdGVtcGxhdGUgPGludCBOLCBpbnQuLi4gSXM+CiAgICBzdHJ1Y3QgZ2VuX3NlcSA6IGdlbl9zZXE8TiAtIDEsIE4gLSAxLCBJcy4uLj4ge307CgogICAgdGVtcGxhdGUgPGludC4uLiBJcz4KICAgIHN0cnVjdCBnZW5fc2VxPDAsIElzLi4uPiA6IHNlcTxJcy4uLj4ge307CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQsIGludC4uLiBJcz4KICAgIGF1dG8gdHJhbnNwb3NlKHN0ZDo6dHVwbGU8c3RkOjp2ZWN0b3I8VD4uLi4+JiB2YXIsIHNlcTxJcy4uLj4pCiAgICAgICAgLT4gc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxULi4uPj4KICAgIHsKICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPFQuLi4+PiByZXN1bHQ7CiAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHN0ZDo6Z2V0PDA+KHZhcikuc2l6ZSgpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OnR1cGxlPFQuLi4+IHQgPSBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8SXM+KHZhcilbaV0uLi4pOwogICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKHQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVCwgaW50Li4uIElzPgogICAgYXV0byB0cmFuc3Bvc2Uoc3RkOjp0dXBsZTxzdGQ6OnZlY3RvcjxUPi4uLj4mIHZhcikKICAgICAgICAtPiBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPFQuLi4+PgogICAgewogICAgICAgIHJldHVybiB0cmFuc3Bvc2UodmFyLCBnZW5fc2VxPHNpemVvZi4uLihUKT4oKSk7CiAgICB9CgogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgI2luY2x1ZGUgPGlvbWFuaXA+CgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdmkgPSB7NDIsIDE3MjksIDZ9OwogICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHZiID0ge3RydWUsIGZhbHNlLCBmYWxzZX07CiAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZzID0geyJIaSIsICJIZXkiLCAiSG8ifTsKICAgICAgICBhdXRvIHQgPSBtYWtlX3R1cGxlKHZpLCB2YiwgdnMpOwogICAgICAgIGF1dG8gdiA9IHRyYW5zcG9zZSh0KTsKCiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhOwogICAgICAgIGZvciAoYXV0byBjb25zdCYgdCA6IHYpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIigiOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpnZXQ8MD4odCk7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiLCAiIDw8IHN0ZDo6Z2V0PDE+KHQpOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiwgIiA8PCBzdGQ6OmdldDwyPih0KTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICIpIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgfQogICAgfQo=