gpt4 book ai didi

c++ - 反转 C++ 元组

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:49 24 4
gpt4 key购买 nike

我想反转 C++ 元组的内容。我正在尝试 this answer 中建议的以下代码:

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

但是我从 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...>
^

而且我不知道如何修复它。有什么想法吗?

最佳答案

我认为您发布的代码与错误消息不符。要得到那个错误,应该有另一个 )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>()))

这仍然不起作用,因为当使用左值元组调用时,类型 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
}

关于c++ - 反转 C++ 元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com