如何在 mpl::list 中声明 boost 递归变体?

Posted

技术标签:

【中文标题】如何在 mpl::list 中声明 boost 递归变体?【英文标题】:How to declare a boost recursive variant in mpl::list? 【发布时间】:2013-07-16 05:13:46 【问题描述】:

如何使这种递归变体起作用?我想要一个变体容器或变体容器容器。

template <class T>
class A 
 
    // ...
    T t_;
;

template <class T>
class AVariant

    typedef typename boost::make_variant_over<T>::type Type;
    Type t;

    // ...
;

template <class Container>
class Composite

    typedef typename Container::value_type T;
    Container container_of_any_;

    // ....
;

在 main.cpp 中:

typedef AVariant<boost::mpl::list<
    A<int>,
    A<long>,
    boost::recursive_wrapper<Composite<std::vector<Any> > > // Compile error: 'Any' is not declared in this scope
> > Any;

我知道 Compoiste > 不正确,但不确定如何?

编辑: 我更改了以下内容:

template <class T>
class AVariant

    typedef typename boost::make_recursive_variant_over<T>::type Type;
    Type t_;

    // ...

    template <class Archive>
    class SerializeVisitor : public boost::static_visitor<>
    
        SerializeVisitor( Archive& ar ) : ar_(ar) 
        template <typename U>
        void operator()( const U& t ) const
        
            ar_ & BOOST_SERIALIZATION_NVP( t );
        
    ;

    friend class boost::serialization::access;
    template<class Archive>
    void serialize( Archive& ar, const unsigned int version )
    
        boost::apply_visitor( SerializeVisitor<Archive>( ar ), t_ );
    

;

然后使用实例化:

typedef AVariant<boost::mpl::list<
    A<double>,
    A<int>,
    std::vector<boost::recursive_variant_> // to make the recursion slightly simplier
> > Any;

我的 AVariant 有一个访问者可以按上述方式进行序列化。在 main() 中调用序列化时,它仍然会给出编译错误。似乎在错误中寻找类 std::vector 的 serialize() 函数:

const class std::vector<boost::variant<boost::detail::variant::recursive_flag<boost::detail::variant::over_sequence<boost::mpl::vector<A<double>, A<long int>, A, std::vector<boost::recursive_variant_, std::allocator<boost::recursive_variant_> >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> > >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, std::allocator<boost::variant<boost::detail::variant::recursive_flag<boost::detail::variant::over_sequence<boost::mpl::vector<A<double>, A<long int>, A, std::vector<boost::recursive_variant_, std::allocator<boost::recursive_variant_> >, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> > >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_> > >' has no member named 'serialize'

【问题讨论】:

【参考方案1】:

你需要使用boost::make_recursive_variant而不是boost::recursive_wrapper,里面有boost::recursive_variant_。所以你应该试试这个:

typedef AVariant<boost::mpl::list<
A<int>,
A<long>,
boost::make_recursive_variant<Composite<std::vector<boost::recursive_variant_> > 
  >::type > > Any;

这可以帮助你。

您应该参考这里:http://www.boost.org/doc/libs/1_54_0/doc/html/variant/tutorial.html#variant.tutorial.recursive.recursive-variant 在这里http://www.boost.org/doc/libs/1_54_0/boost/variant/recursive_variant.hpp 了解有关递归变体的更多信息。 如果要序列化变体最好使用boost::variant访问机制写出变体中包含的实际类型:

 variant_serializer ser;
 boost::apply_visitor( ser, your_variant);

【讨论】:

谢谢。 boost::recursive_variant_ 有什么作用?似乎试图放置一个占位符来延迟类型声明。当我尝试序列化 Any(A、AVariant 和 Composite 都有 serialize() 函数)时,它给了我错误: boost::make_recursive_variant, std ::allocator<:arg> > > >, ... >' 没有名为 'serialize' 的成员。 A、AVariant 和 Composite 都有 serialize() 函数。 AVariant 也有 serialize() 访问者。我已经编辑了原始帖子以反映这些内容。但是编译还是不行。它似乎在递归变体周围寻找 serialize() 函数。

以上是关于如何在 mpl::list 中声明 boost 递归变体?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PyObjects 声明 Boost.Python C++ 类

boost::asio::read 函数挂起

前向声明 boost.type_erasure 引用类型

具有前向声明类型的 Boost.TypeErasure

修改 Boost Python 包装类?

Boost.Python 是如何工作的?