1

我正在尝试使用 a 的反向副本将标签调度到一个函数中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实际上不是a boost::mpl::vector,并且调度失败:

main.cpp:27:2: 错误: 没有匹配的函数调用'destroy'
        销毁(类型名 boost::mpl::reverse::type{});
        ^~~~~~~
main.cpp:18:6:注意:候选模板被忽略:无法将 'vector' 与 'v_item' 匹配
无效销毁(升压::mpl::vector){
     ^
  • 如何轻松地在两个方向上操作类型列表?
  • Boost.MPL 是否天生与可变参数模板不兼容?

如果需要,我可以放弃 Boost.MPL,只要替代方案是标准或 Boost。我正在使用 MSVC 14.1。

4

1 回答 1

2

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>,因此可以按照您想要的方式使用。

于 2018-01-24T17:53:32.860 回答