我正在尝试编写一个元函数,它(在 haskell 中)看起来大致如下:
gather :: [a] -> [a] -> ([a], [a])
gather (x:xs) (_:_:ys) = <something using x, xs, and ys>
...other pattern matches...
我能够使用自己滚动的可变参数模板序列来做到这一点,但似乎无法弄清楚如何使用 mpl 来做到这一点。
为简单起见,我正在尝试这个示例函数(应该可以帮助我理解我需要什么):
//get_first :: [a] -> a
template<class SEQ_C>
get_first {
enum { value = -1 };
typedef get_first<SEQ_C> type;
};
//get_first (x:xs) = x
template<template<class T, T... S> class SEQ_C, class T, T x, T... xs>
struct get_first<SEQ_C<T, x, xs...>> {
enum { value = x };
typedef get_first<SEQ_C<T, x, xs...>> type;
};
...
typedef boost::mpl::vector_c<int 1, 2, 3> listA;
typedef get_first<listA>::type first;
std::cout << first::value << std::endl;
输出-1。
在这一点上,我已经尝试了许多不同的方法来获得比赛,我只是在黑暗中刺伤。该文档使它看起来mpl::vector_c<int, x>
实际上是一个列表integral_c<int, x>
- 但尝试使用此结果是其他错误。
也许模式匹配