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

How to declare a boost recursive variant in mpl::list?

本文关键字:boost 递归 声明 list mpl      更新时间:2023-10-16

如何使这个递归变体工作?我想要一个变体的容器,或者变体的容器的容器。

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'

您需要使用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-变体在这里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);