使用mpl :: vector来定义boost :: variant类型

时间:2011-07-21 09:29:45

标签: c++ boost-mpl boost-variant

我正在使用库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 个答案:

答案 0 :(得分:1)

变体类型定义是正确的,问题是由于程序中的泛型函数采用任意变量作为参数。实际上,make_variant_over<mpl::vector<T0, T1, ...>>的行为与variant<T0, T1, ...>相似,但类型不同:它是variant<over_sequence<vector<T0, T1, ...>>>(因此T0对应over_sequence<vector<T0, T1, ...>>