Я пытаюсь пометить отправку в функцию с обращенной копией 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{});
}
Как видите, цель состоит в том, чтобы два процесса 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. Я использую MSVC 14.1.
Является ли 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>
и так будет использоваться так, как вы хотите.
Других решений пока нет …