2013-06-25 11 views
0

그래서 나는 a를 변환하는 함수를 찾으려고 노력하고있다.튜플을 풀기 위해서 std :: pair <T, std :: pair <U, std :: pair <...> >>을 푸는 것 <T,U,...>

std::pair<T,std::pair<U, V>> 

데이터 유형 std::tuple;

std::tuple<T,U,V> 

일반적으로 혼합 유형 인수의 임의의 수와 함께 작동해야합니다. 쌍의 형식은 다음과 같습니다.

  • '자동차'항상 유형이 될 것입니다 것은,
  • '지휘관'항상있을 것입니다 std::pair의 '지휘관'는 형식 자체
    될 것 안쪽 경우를 제외하고
    • (유형은 임의이므로 std::pair 일 수 있음).

나는 가변 인자 템플릿 인수를 통해 사전에 알려져 검색 할 인수의 수와 유형.

현재 진행률이 다소 낮습니다. 몇 가지 시도를 해봤지만 필요한 코드가이 줄에있는 것 같습니다. 나는이 작업을 자동으로 생성 할 수있는 방법을 찾을 수 없습니다 그러나

std::make_tuple(get<0>(pair), get<0>(get<1>(pair), get<0>(get<1>(get<1>(pair), ..., get<1>(pair))))); 

, 나는 Sequence<int...> 접근 방식을 시도했지만 운이없이, 그러나 나는 예 데, 나는 고려해야 할 그 라인을 따라 뭔가 생각 다양한 수의 인덱스를 사용하는 get 메소드를 사용하여 일반 get 메소드를 사용하여 여러 번 조회합니다.

답변

2

어떻게 간단한 재귀에 대한

#include <utility> 
#include <tuple> 

// 1. metafunction to concatenate a type and a tuple 
template<typename T, typename U> struct tuple_prepend_type; 

template<typename T, typename ...U> 
struct tuple_prepend_type<T, std::tuple<U...>> 
{ 
    using type = std::tuple<T, U...>; 
}; 

// 2. is_pair type trait 
template<typename> 
struct is_pair : std::false_type {}; 
template<typename U, typename V> 
struct is_pair<std::pair<U, V>> : public std::true_type {}; 

// 3. the converter itself 
template<typename T, typename = void> 
struct pairs_to_tuple { 
    using type = std::tuple<typename T::first_type, 
          typename T::second_type>; 
}; 

template<typename T> 
struct pairs_to_tuple<T, typename std::enable_if< 
         is_pair<typename T::second_type>::value 
        >::type 
     > 
{ 
    using type = typename tuple_prepend_type< 
        typename T::first_type, 
        typename pairs_to_tuple<typename T::second_type>::type 
       >::type; 
}; 

int main() 
{ 
    std::pair<int, std::pair<double, std::pair<bool, char> > > p; 
    static_assert(std::is_same<pairs_to_tuple<decltype(p)>::type, 
           std::tuple<int, double, bool, char>>::value, "") 
}