如何反转元组中的类型?例如,我希望reverse_tuple<std::tuple<int, char, bool>>::type
变为std::tuple<bool, char, int>
。我尝试执行以下操作,但没有成功。我做错了什么?
#include <type_traits>
#include <tuple>
template <typename... Ts>
struct tuple_reverse;
template <typename T, typename... Ts>
struct tuple_reverse<std::tuple<T, Ts...>>
{
using type = typename tuple_reverse<
std::tuple<
typename tuple_reverse<std::tuple<Ts..., T>>::type
>
>::type;
};
template <typename T>
struct tuple_reverse<std::tuple<T>>
{
using type = std::tuple<T>;
};
int main()
{
using result_type = std::tuple<int, bool, char>;
static_assert(
std::is_same<
tuple_reverse<var>::type, std::tuple<char, bool, int>
>::value, ""
);
}
以下是我的错误:prog.cpp: In instantiation of ‘struct tuple_reverse<std::tuple<char, int, bool> >’:
prog.cpp:15:34: recursively required from ‘struct tuple_reverse<std::tuple<bool, char, int> >’
prog.cpp:15:34: required from ‘struct tuple_reverse<std::tuple<int, bool, char> >’
prog.cpp:29:31: required from here
prog.cpp:15:34: error: no type named ‘type’ in ‘struct tuple_reverse<std::tuple<int, bool, char> >’
prog.cpp: In function ‘int main()’:
prog.cpp:30:9: error: template argument 1 is invalid
6条答案
按热度按时间vxqlmq5t1#
你做错的地方在这里:
从里到外查看,您可以对元组元素重新排序:
tuple<Ts..., T>
,然后你试着反转它,然后你把结果放在tuple
中,然后你试着反转 * 那个 *...嗯?!:)这意味着每次示例化
tuple_reverse
时,都给予它一个相同大小的元组,所以它永远不会完成,而是递归地示例化自己(然后,如果递归完成了,就把结果元组类型放入元组中,这样就得到了一个包含N个元素元组的单元素元组,然后反转它,这没有任何作用,因为反转单元素元组是一个空操作)。您需要剥离其中一个元素,然后反转其余元素,再将其连接回去:
而且你不需要把它 Package 在一个元组里,然后再把它反转过来:)
而且你还应该处理空元组的情况,所以整个事情是:
不过,我会换个方式。
要只获取类型,请使用C++14
或者你可以写一个函数来反转一个实际的tuple对象,然后使用
decltype(reverse(t))
来获得类型。在C++14中反转一个类似tuple的对象:在C++11中使用
<integer_seq.h>
并添加返回类型,使用remove_reference
从元组类型中剥离引用(因为tuple_size
和tuple_element
不处理对元组的引用):qjp7pelc2#
未经测试。
反正也差不多。
这也只是反转类型,这似乎是你所追求的。反转一个实际的元组将涉及函数,而不是元函数。
nbnkbykc3#
我在处理任意类型的反转模板参数时遇到了这个问题。
Jonathan Wakely的答案对于元组非常有效,但是如果其他人需要反转任何类型,例如
T<P1, P2, ..., Pn>
到T<Pn, Pn-1, ..., P1>
,下面是我得出的结果(Reversal logic taken from here)。有些实现逻辑可以组合起来,但我在这里尽量把它说清楚。
reverse_type
可以应用于元组:或其他类型:
Slightly more detailed explanation .
vnjpjtjt4#
我把Faheem Mitha'sSequenceHelper和Jonathan Wakely'stuple_reverse组合起来,反转元组类型和数据,这个解决方案在c++11下也能用。
wfveoks05#
出于兴趣,您真的想反转元组类型,还是只是以相反的顺序处理每个元素(在我的项目中更常见)?
ws51t4hk6#