首页 > 解决方案 > 用 C++17 特性替换 Boost MPL 容器

问题描述

我有一些基于 MPL 容器的旧代码,enable_if用于激活一些调度,如下所示:

typedef boost::mpl::vector<std::int16_t, std::int32_t, int64_t, float, double, std::complex<float>, std::complex<double> > Types;

template <typename Vector>
typename boost::enable_if<typename boost::mpl::empty<Vector>::type, void>::type void process(/*args*/)
{
}

template <typename Vector>
typename boost::disable_if<typename boost::mpl::empty<Vector>::type, void>::type void process(/*args*/)
{
    process<typename boost::mpl::pop_front<Vector>::type>();
}

void outside()
{
    process<Types>();
}

所以对于 C++17,我可以使用 constexpr,但我仍然需要传入的类型列表outside。是否有适当的方法来声明容器类型以便我可以使用可变参数模板?

标签: c++metaprogrammingc++17boost-mpl

解决方案


可能最简单的转换是将 Boost.MPL 换成Boost.MP11

using Types = mp_list<...>;


template <typename L>
void process() {
    if constexpr (!mp_empty<L>) {
        process<mp_pop_front<L>>();   
    }
}

推荐阅读