Я пытаюсь написать metafunction, который (в Haskell) выглядит примерно так:подталкивания шаблон последовательности MPL соответствие
gather :: [a] -> [a] -> ([a], [a])
gather (x:xs) (_:_:ys) = <something using x, xs, and ys>
...other pattern matches...
Я был в состоянии сделать это с помощью рулонного моего собственного собственного VARIADIC последовательности шаблонов, но могу Похоже, вы не знаете, как это сделать, используя 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>
- но попытка использования этого результата - другие ошибки.
Может быть шаблон
Насколько я могу судить, проблема в том, что последовательности boost :: mpl фактически не используют вариативные шаблоны, а имитируют их. Итак, 'mpl :: vector_c' становится 'mpl :: vector ' где '2147483647l' повторяется до тех пор, пока мы не достигнем BOOST_MPL_LIMIT_VECTOR_SIZE. В моем ролике я фактически использовал 'template ', который рассказал компилятору, чего ожидать. Я полагаю, что это не стандарт, чтобы попытаться выяснить, как вещи * предполагается * работать: Если вы передаете невариантный тип шаблона в качестве параметра шаблона, должен ли он соответствовать? –
nickdmax