反转C++元组

Ele*_*ito 0 c++ reverse tuples c++11

我想颠倒C++元组的内容.我正在尝试在这个答案中建议的以下代码:

template<typename T, size_t... I>
auto
reverse_impl(T&& t, redi::index_sequence<I...>)
-> std::tuple<typename std::tuple_element<sizeof...(I) - 1 - I, T>::type...>
{
    return std::make_tuple(std::get<sizeof...(I) - 1 - I>(std::forward<T>(t));
}

template<typename T>
auto
reverse(T&& t)
-> std::tuple<typename std::tuple_element<N - 1 - I, T>::type...>
{
    return reverse_impl(std::forward<T>(t),
                        redi::make_index_sequence<std::tuple_size<T>::value>());
}
Run Code Online (Sandbox Code Playgroud)

但我从g ++ 4.8.1得到这些错误消息:

foo.cc: In function ‘std::tuple<typename std::tuple_element<((sizeof (I ...) - 1) - I), T>::type ...> reverse_impl(T&&, redi::index_sequence<I ...>)’:
foo.cc:12:76: error: parameter packs not expanded with ‘...’:
   return std::make_tuple(std::get<sizeof...(I) - 1 - I>(std::forward<T>(t)));
                                                                            ^
foo.cc:12:76: note:         ‘I’
foo.cc: At global scope:
foo.cc:18:43: error: ‘N’ was not declared in this scope
 -> std::tuple<typename std::tuple_element<N - 1 - I, T>::type...>
                                           ^
foo.cc:18:51: error: ‘I’ was not declared in this scope
 -> std::tuple<typename std::tuple_element<N - 1 - I, T>::type...>
                                                   ^
foo.cc:18:55: error: template argument 1 is invalid
 -> std::tuple<typename std::tuple_element<N - 1 - I, T>::type...>
                                                       ^
foo.cc:18:62: error: expected parameter pack before ‘...’
 -> std::tuple<typename std::tuple_element<N - 1 - I, T>::type...>
                                                              ^
foo.cc:18:65: error: template argument 1 is invalid
 -> std::tuple<typename std::tuple_element<N - 1 - I, T>::type...>
                                                                 ^
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决它.有任何想法吗?

Jon*_*ely 5

我认为您发布的代码与错误消息不符.为了得到这个错误应该有另一个)之后std::forward<T>(t),但是要解决这个错误应该是)...

代码仍然是假的,N第二个函数是什么?(这显然是我的错,因为它复制的答案也是我的!)

它应该是:

template<typename T>
auto
reverse(T&& t)
-> decltype(reverse_impl(std::forward<T>(t),
                        redi::make_index_sequence<std::tuple_size<T>::value>()))
Run Code Online (Sandbox Code Playgroud)

这仍然不起作用,因为当使用左值元组调用时,类型T被推断为std::tuple<...>&并且您不能使用tuple_sizetuple_element引用引用,因此您需要删除引用:

#include <tuple>
#if __cplusplus > 201103L
namespace redi = std;
#else
#include <integer_seq.h>
#endif

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>());
}

int main()
{
  std::tuple<int, char, double> t;
  std::tuple<double, char, int> tt;
  tt = reverse(t);                  // test with lvalue
  tt = reverse(std::move(t));       // test with rvalue
}
Run Code Online (Sandbox Code Playgroud)