Замена Boost MPL-контейнеров функциями C ++ 17 - PullRequest
0 голосов
/ 10 октября 2018

У меня есть некоторый старый код, основанный на контейнерах 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.Есть ли правильный способ объявления типа контейнера, чтобы я мог использовать шаблоны с переменным числом символов?

1 Ответ

0 голосов
/ 10 октября 2018

Вероятно, самым простым переходом было бы заменить Boost.MPL на Boost.MP11 :

using Types = mp_list<...>;


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