如何转变这种类型:变换元组“三角”的元组
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)>
>
如何转变这种类型:变换元组“三角”的元组
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)>
>
右...
是不够的,但是你总是可以使用模式匹配(即部分专业化)与递归:
#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当我们写
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
显示的代码是正确的。
在G ++ 4.6.1我得到“错误:预期不合格-ID使用前”在整数::的push_back [因为它太旧了](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51139),但它适用于'template
@pascal是g ++ - 4.6不支持别名模板。 – kennytm 2012-02-04 03:18:37
创建一个“广场”的元组[竟然是微不足道的(http://stackoverflow.com/questions/9123712/transform-tuple-type/),但我想这其中的确涉及计数,尤其是因为我想在_first_ n个元素,所以只使用一个'<头,尾...>'结构是不够的...... – pascal 2012-02-03 17:07:40