2011-07-21 39 views
4

我正在使用库boost::variant来存储大量的类型。随着类型数量的增长,我很快会达到20种类型的限制。在文档中,似乎可以使用mpl::vector来定义变体,该变体允许超过20种类型(如果我是正确的,则最多为50个)。我试图替换我的变体定义是这样的:使用mpl :: vector来定义boost :: variant类型

#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的新手,所以也许我错过了一些东西 - 但找不到什么!我做得好吗?

在此先感谢。

+0

虽然与简化版本, 在问题的代码可以对 编译[ideone](HTTP:/ /ideone.com/Sgx02)。 这个[document](http://www.boost.org/doc/libs/1_47_0/doc/html/variant/tutorial.html#variant.tutorial.over-sequence) 说: 由于在几个编译器中的标准一致性问题,'make_variant_over' 并不是普遍可用的。在这些编译器中,库指示它的 缺少通过预处理符号定义的语法支持 'BOOS T_VARIANT_NO_TYPE_SEQUENCE_SUPPORT'._ 所以我建议检查'BOOST_VARIANT_NO_TYPE_SEQUENCE_SUPPORT'的值。 –

+0

问题中的高级功能。看起来这不是一个问题,因为变体的定义,而是一个泛型函数,它将一个变体作为输入'boost :: variant '。这个函数将'T0'视为'boost :: detail :: variant :: over_sequence >',不明白为什么暂时。 – neodelphi

回答

1

变体类型定义是正确的,问题是由于程序中的泛型函数以任意变体作为参数。事实上,make_variant_over<mpl::vector<T0, T1, ...>>行为就像variant<T0, T1, ...>但是不一样的类型的:它是一个variant<over_sequence<vector<T0, T1, ...>>>(所以T0对应于over_sequence<vector<T0, T1, ...>>

相关问题