2013-05-15 4 views
2

벡터 튜플을 튜플 벡터로 바꾸려고합니다 (그 반대의 경우도 마찬가지입니다). tuple_transpose 기능을 호출하는 데 문제가 있습니다. - 내가 할 수있는 잘못된 일을 어떻게하고 무엇 http://ideone.com/7AWiQQ#view_edit_box일치하는 함수 호출 오류가 없습니다. C++

prog.cpp: In function ‘int main()’:
prog.cpp:44:24: error: no matching function for call to ‘tuple_transpose(std::tuple >, std::vector > >&)’
prog.cpp:44:24: note: candidates are:
prog.cpp:30:6: note: template typename transpose::type tuple_transpose(std::tuple >...>&, seq)
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 typename transpose::type tuple_transpose(std::tuple >...>&)
prog.cpp:36:6: note: template argument deduction/substitution failed:
prog.cpp: In substitution of ‘template typename transpose::type tuple_transpose(std::tuple >...>&) [with T = {int, bool}]’:
prog.cpp:44:24: required from here
prog.cpp:36:6: error: no type named ‘type’ in ‘struct transpose >, std::vector > >&>’

여기
#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>...>; 
}; 

// Indicies from Andy Prowl's answer 
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); // error 
    ... 
} 

는 거기에 오류가있는 데모입니다 : 나는 하나 개의 인자로 호출하면 나는 일치 함수 호출 오류 고쳐? 감사. 당신은 동일한 크기의 벡터를 가정하는 경우

+0

"튜플을 튜플 벡터로 변경하는 것"이란 무엇을 의미합니까? 바꾸어 놓다? 벡터의 길이가 다른 경우 어떻게해야합니까? 현재 오류는'decltype (var)'이 참조 유형이기 때문에 코드에 다른 문제가 있으며, 특히 변환 논리가 완전히없는 것입니다. 나는 단지 튜플을 풀고 재 포장하는 것을 본다. – zch

+0

braced-init-list에서 벡터를 확장하는 아이디어는 런타임에 벡터 크기 만 알기 때문에 작동하지 않습니다. Andy Prowl의 대답을 참조하십시오. – dyp

답변

2

,이 작업을 수행해야합니다

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; 
    } 
} 
마지막으로

하는 live example.

관련 문제