는 여기에 있었다 : 안쪽에서 바깥에서 보면
using type = typename tuple_reverse<
std::tuple<
typename tuple_reverse<std::tuple<Ts..., T>>::type
>
>::type;
, 당신은 튜플 요소의 순서 : 당신은 tuple
에 결과를 넣어 tuple<Ts..., T>
는, 당신은 그 반대로하려고, 그럼 당신은 을 ... 거꾸로하려고? 응?! :)
즉, tuple_reverse
을 인스턴스화 할 때마다 동일한 크기의 튜플을 제공하므로 절대로 완료되지 않으며 반복적으로 영원히 인스턴스화됩니다. (그런 다음 재귀가 완료된 경우에도 결과 튜플 유형을 튜플에 넣으므로 N- 요소 튜플을 포함하는 단일 요소 튜플을 가지며 그 반대의 작업을 수행합니다. 단일 요소 튜플을 반전하는 것이 무 조작 없음)
당신은 요소 중 하나를 벗겨하려면, 다음 나머지를 역으로 다시 다시 연결할 :.
using head = std::tuple<T>;
using tail = typename tuple_reverse<std::tuple<Ts...>>::type;
using type = decltype(std::tuple_cat(std::declval<tail>(), std::declval<head>()));
을 그리고 당신은 튜플에 포장 할 필요가 없습니다 및 다시 역으로 :)
빈 터플 케이스도 처리해야하므로 모든 것이 다음과 같습니다.
template <typename... Ts>
struct tuple_reverse;
template <>
struct tuple_reverse<std::tuple<>>
{
using type = std::tuple<>;
};
template <typename T, typename... Ts>
struct tuple_reverse<std::tuple<T, Ts...>>
{
using head = std::tuple<T>;
using tail = typename tuple_reverse<std::tuple<Ts...>>::type;
using type = decltype(std::tuple_cat(std::declval<tail>(), std::declval<head>()));
};
나는 다르게 할 것입니다.
는 C++ 14
template<typename T, size_t... I>
struct tuple_reverse_impl<T, std::index_sequence<I...>>
{
typedef std::tuple<typename std::tuple_element<sizeof...(I) - 1 - I, T>::type...> type;
};
// partial specialization for handling empty tuples:
template<typename T>
struct tuple_reverse_impl<T, std::index_sequence<>>
{
typedef T type;
};
template<typename T>
struct tuple_reverse<T>
: tuple_reverse_impl<T, std::make_index_sequence<std::tuple_size<T>::value>>
{ };
를 사용하여, 단지 유형을 얻으려면 또는 당신은, 실제 튜플 객체를 역 유형을 얻을 수 decltype(reverse(t))
를 사용하는 함수를 작성할 수 있습니다.C++ 14에서 튜플 같은 객체 반전하려면
template<typename T, size_t... I>
auto
reverse_impl(T&& t, std::index_sequence<I...>)
{
return std::make_tuple(std::get<sizeof...(I) - 1 - I>(std::forward<T>(t))...);
}
template<typename T>
auto
reverse(T&& t)
{
return reverse_impl(std::forward<T>(t),
std::make_index_sequence<std::tuple_size<T>::value>());
}
C++ (11) 사용 <integer_seq.h>
에서와 반환 형식을 추가하고 tuple_size
및 tuple_element
이 작동하지 않기 때문에 (튜플 형식에서 참조를 제거하는 remove_reference
를 사용 튜플에 대한 참조와 함께) :
template<typename T, typename TT = typename std::remove_reference<T>::type, size_t... I>
auto
reverse_impl(T&& t, redi::index_sequence<I...>)
-> std::tuple<typename std::tuple_element<sizeof...(I) - 1 - I, TT>::type...>
{
return std::make_tuple(std::get<sizeof...(I) - 1 - I>(std::forward<T>(t))...);
}
template<typename T, typename TT = typename std::remove_reference<T>::type>
auto
reverse(T&& t)
-> decltype(reverse_impl(std::forward<T>(t),
redi::make_index_sequence<std::tuple_size<TT>::value>()))
{
return reverse_impl(std::forward<T>(t),
redi::make_index_sequence<std::tuple_size<TT>::value>());
}
나는이 작업을 수행하기 위해 재귀를 필요가 있다고 생각하지 않습니다 [tuple_cat] (http://www.cplusplus.com/reference/tuple/tuple_cat/),하지만 당신은 튜플을 반전 할 왜 – aaronman