Ram*_*Ram 2 c++ template-meta-programming c++11
我是元编程的新手.我看过其他类似的问题,但没有一个问题符合我的要求.
这是我尝试反转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();
}
Run Code Online (Sandbox Code Playgroud)
期待一个紧凑而简单的解决方案.
这是使用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>>{}>());
}
Run Code Online (Sandbox Code Playgroud)
演示.对于C++ 11,可以使用相同的过程,但make_index_list必须提供辅助模板.