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)
我不知道如何解决它.有任何想法吗?
我认为您发布的代码与错误消息不符.为了得到这个错误应该有另一个)之后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_size或tuple_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)
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |