gpt4 book ai didi

c++ - 紧凑且简单的 std::tuple 反转

转载 作者:行者123 更新时间:2023-12-02 01:42:06 25 4
gpt4 key购买 nike

我是元编程新手。我看过其他类似的问题,但没有一个能达到我真正想要的效果。

这是我尝试反转 std::tuple 的尝试。我遇到的主要问题是反转输入元组中的数据。

反转索引的逻辑并不令人满意,我无法从这个阶段继续。

到目前为止的代码:

//===========================================================!
// type inversion of a tuple

template < typename Tuple, typename T >
struct tuple_push;

template < typename T, typename ... Args >
struct tuple_push<std::tuple<Args...>, T>
{
typedef std::tuple<Args..., T> type;
};

template < typename Tuple >
struct tuple_reverse;

template < typename T, typename ... Args >
struct tuple_reverse<std::tuple<T, Args...>>
{
typedef typename tuple_push<typename tuple_reverse<std::tuple<Args...>>::type, T>::type type;
};

template < >
struct tuple_reverse<std::tuple<>>
{
typedef std::tuple<> type;
};
//===========================================================!


template <typename First, typename ...Tails>
auto inverse(std::tuple<First, Tails...> & data)
-> decltype(tuple_reverse<std::tuple<First,Tails...>>::type)
{
using reverse_tup = tuple_reverse<std::tuple<First, Tails...>>::type;
static_assert(false, "Confused!")
return reverse_tup();
}

期待一个紧凑而简单的解决方案。

最佳答案

这是使用 C++14 的可能解决方案:

template <typename T, std::size_t... indices>
auto invert(T &&tuple, std::index_sequence<indices...>) {
// Using decay_t as the argument must be a tuple, and this shortens the code
using tuple_t = std::decay_t<T>;
constexpr auto tuple_size = std::tuple_size<tuple_t>{};
return std::tuple<std::tuple_element_t<tuple_size - indices - 1, tuple_t>...>(
std::get<tuple_size - indices - 1>(std::forward<T>(tuple))...);
}

template <typename T>
auto invert(T &&tuple) {
return invert(std::forward<T>(tuple),
std::make_index_sequence<std::tuple_size<std::decay_t<T>>{}>());
}

Demo 。对于 C++11,可以执行相同的过程,但必须提供像 make_index_list 这样的帮助器模板。

关于c++ - 紧凑且简单的 std::tuple 反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240468/

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