将元组转换为“三角"元组.元组 [英] Transform tuple to "triangular" tuple

查看:89
本文介绍了将元组转换为“三角"元组.元组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何转换此类型:

std::tuple<T0, T1, ..., TN1, TN>

对此:

std::tuple<
  std::function<T0()>,
  std::function<T1(T0)>,
  std::function<T2(T0, T1)>,
  ...
  std::function<TN(T0, ..., TN1 )>
>

推荐答案

正确的 ... 是不够的,但是您可以始终在递归中使用模式匹配(即部分专业化):

Right ... isn't suffice, but you could always use pattern matching (i.e. partial specialization) with recursion:

#include <tuple>
#include <functional>
#include <cstdlib>

// A type to store list of integers 
template <size_t... ns>
struct integers
{
    template <size_t n>
    using push_back = integers<ns..., n>;
};

// This generates 'integers<0, 1, 2, ..., n-1>'
template <size_t n>
struct iota
{
    typedef typename iota<n-1>::type::template push_back<n-1> type;
};
template <>
struct iota<0>
{
    typedef integers<> type;
};

// Put a type to the front of the argument list
template <typename T, typename U>
struct push_front;
template <typename T, typename R, typename... A>
struct push_front<R(A...), T>
{
    typedef R type(T, A...);
};

// This converts 'std::tuple<T0, T1, ..., TN>' to the function type
// 'TK(T0, T1, ..., TK-1)' where K is the first parameter
template <size_t, typename...>
struct slice;
template <size_t end, typename First, typename... Rest>
struct slice<end, First, Rest...>
{
    typedef typename push_front<typename slice<end-1, Rest...>::type, First>::type type;
};
template <typename First, typename... Rest>
struct slice<0, First, Rest...>
{
    typedef First type();
};

// This calls 'slice' on T... for all integers in the list.
template <typename T, typename U>
struct triangularize_impl;
template <typename... T, size_t... n>
struct triangularize_impl<std::tuple<T...>, integers<n...>>
{
    typedef std::tuple<std::function<typename slice<n, T...>::type>...> type;
};

// This is a wrapper of 'triangularize_impl'.
template <typename T>
struct triangularize;
template <typename... T>
struct triangularize<std::tuple<T...>>
{
    typedef typename triangularize_impl<std::tuple<T...>, typename iota<sizeof...(T)>::type>::type type;
};

作为演示,我们在g ++ 4.7中编写

As a demo, in g++ 4.7 when we write

triangularize<std::tuple<int, float, double, char>>::type d = 0;

错误消息显示

error: conversion from ‘int’ to non-scalar type
      ‘triangularize<std::tuple<int, float, double, char> >::type {aka
       std::tuple<std::function<int()>,
                  std::function<float(int)>,
                  std::function<double(int, float)>,
                  std::function<char(int, float, double)> >}’
       requested

显示正确的代码.

这篇关于将元组转换为“三角"元组.元组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆