Использование mpl :: vector для определения типов boost :: variable - PullRequest
4 голосов
/ 21 июля 2011

Я использую библиотеку boost::variant для хранения большого количества типов. Поскольку число типов растет, я скоро достигну предела в 20 типов. В документации кажется возможным определить вариант, используя mpl::vector, который допускает более 20 типов (до 50, если я прав). Я попытался заменить свое определение варианта следующим образом:

#include <boost/variant.hpp>
#include <boost/mpl/vector.hpp>

typedef boost::mpl::vector<
    float,
    math::float2,
    math::float3,
    relative_point<1>,
    relative_point<2>,
    relative_point<3>,
    std::string,
    color,
    group,
    dictionnary,
    reference,
    line,
    strip,
    text,
    font
> variant_mpl_vec;

typedef boost::make_variant_over<variant_mpl_vec>::type data_type;

// This is the old definition
/*typedef boost::variant<
    float,
    math::float2,
    math::float3,
    relative_point<1>,
    relative_point<2>,
    relative_point<3>,
    std::string,
    color,
    group,
    dictionnary,
    reference,
    line,
    strip,
    text,
    font
> data_type;*/

Я ставлю прямо мой код. Большинство типов - это структуры, содержащие очень мало данных.

При компиляции получилось странное:

error: no matching function for call to ‘boost::detail::variant::make_initializer_node::apply<boost::mpl::pair< ... and lots more ...

Предыдущее определение варианта работало нормально, поэтому я удивлен, что моя замена не работает. Я новичок в mpl, так что, может быть, я что-то упустил - но не могу найти что! У меня все хорошо?

Заранее спасибо.

1 Ответ

1 голос
/ 23 июля 2011

Определение типа варианта правильное, проблема была в том, что в программе была универсальная функция, принимающая произвольный вариант в качестве параметра.Действительно, make_variant_over<mpl::vector<T0, T1, ...>> ведет себя как variant<T0, T1, ...>, но это не тот же тип: это variant<over_sequence<vector<T0, T1, ...>>> (поэтому T0 соответствует over_sequence<vector<T0, T1, ...>>.

...