    #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;
        }
    }
