Мета-сплат функция C ++ - PullRequest
1 голос
/ 29 мая 2010

Существует ли существующая функция (в boost mpl или fusion) для разделения мета-вектора на аргументы шаблона с переменным числом аргументов? Например:

splat<vector<T1, T2, ...>, function>::type
// that would be the same as
function<T1, T2, ...>

Мой поиск не нашел, и я не хочу изобретать его заново, если он уже существует.

В качестве альтернативы, есть ли решение для:

apply(f, t);
// that would be the same as
f(t[0], t[1], ...);

Учитывая f - некоторая шаблонная функция, а t - последовательность слияния.

edit: после некоторого поиска я нашел его в http://www.boost.org/doc/libs/1_43_0/libs/fusion/doc/html/fusion/functional/invocation/functions.html

1 Ответ

1 голос
/ 29 мая 2010

Вам нужно unpack_args и quoteN, где N - количество аргументов шаблона, которое принимает ваш шаблон. В качестве альтернативы, если вы реализуете function как класс метафункций, вам не нужно quoteN. Пример класса мета-функции, дающего первый из двух заданных типов:

struct function1st {
  template<typename T1, typename T2>
  struct apply { typedef T1 type; };
};

/* create a metafunction class that takes a sequence and apply it to function1st */
typedef unpack_args<function1st> unpacker;

Тогда вы можете использовать unpacker как класс метафункций, который принимает последовательность

BOOST_MPL_ASSERT(( is_same< apply<unpacker, vector<int, char> >::type, int> ));

Или, если у вас есть шаблон, вы должны сначала процитировать его

template<typename T1, typename T2>
struct function1st { typedef T1 type; };

/* create a metafunction class that takes a sequence and apply it to function1st */
typedef unpack_args< quote2<function1st> > unpacker;

Надеюсь, это поможет.

...