Диспетчеризация тегов с преобразованным `boost :: mpl :: vector`s

Я пытаюсь пометить отправку в функцию с обращенной копией boost::mpl::vector:

using InitOrder = boost::mpl::vector<
struct Foo,
struct Bar,
struct Baz
>;

template <class... Stuff>
void initialize(boost::mpl::vector<Stuff...>) {
// Initialize in-order
}

template <class... Stuff>
void destroy(boost::mpl::vector<Stuff...>) {
// Exit in-order
}

void initializeAll() {
initialize(InitOrder{});
}

void destroyAll() {
destroy(typename boost::mpl::reverse<InitOrder>::type{});
}

Coliru demo

Как видите, цель состоит в том, чтобы два процесса initialize а также destroy которые имеют доступ к Stuff пак. Однако, как ответили Вот, boost::mpl::reverse<InitOrder>::type на самом деле не boost::mpl::vectorи отправка не удалась:

main.cpp: 27: 2: ошибка: нет подходящей функции для вызова 'destroy'
уничтожить (typename boost :: mpl :: reverse :: type {});
^ ~~~~~~
main.cpp: 18: 6: примечание: шаблон кандидата игнорируется: не удалось сопоставить вектор с v_item
уничтожить пустоту (boost :: mpl :: vector) {
^
  • Как мне легко работать со списком типов в обоих направлениях?
  • Является ли Boost.MPL по своей сути несовместимым с вариадическими шаблонами?

Я могу отказаться от Boost.MPL, если необходимо, при условии, что альтернатива стандартная или Boost. Я использую MSVC 14.1.

0

Решение

Является ли Boost.MPL по своей сути несовместимым с вариадическими шаблонами?

В принципе. MPL до C ++ 11, так что для использования MPL, вы необходимость использовать их алгоритмы — так, их концепцию последовательности с их итераторами и т. д. Почти наверняка есть очень короткий, умный способ сделать это, но я могу найти их только с помощью догадок и проверок.


По крайней мере, если все, что вам нужно сделать, это обратное, это легко реализовать в C ++ 11:

template <typename...> struct typelist { };

template <typename TL, typeanme R>
struct reverse_impl;

template <typename T, typename... Ts, typename... Us>
struct reverse_impl<typelist<T, Ts...>, typelist<Us...>>
: reverse_impl<typelist<Ts...>, typelist<Us..., T>>
{ };

template <typename... Us>
struct reverse_impl<typelist<>, typelist<Us...>>
{
using type = typelist<Us...>;
};

template <typename TL>
using reverse = typename reverse_impl<TL, typelist<>>::type;

Итак, учитывая:

using InitOrder = typelist<struct Foo, struct Bar, struct Baz>;

затем reverse<InitOrder> было бы typelist<struct Baz, struct Bar, struct Foo>и так будет использоваться так, как вы хотите.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]