如何在mpl::list中声明boost递归变体
How to declare a boost recursive variant in mpl::list?
如何使这个递归变体工作?我想要一个变体的容器,或者变体的容器的容器。
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);
相关文章:
- 如何使用 Boost Hana 删除元编程递归
- 递归 Boost.Spirit 解析的问题
- boost::文件系统递归获取每个文件的大小
- 使用 Boost::Spirit 解析前提条件和递归
- 使用boost::序列化递归图结构时,如何防止堆栈溢出
- Boost.Spirit X3 编译时间因递归规则而爆炸
- boost上的多个递归异步等待
- Boost.Spirit(X3,Boost 1.64):如何正确实施此递归规则
- boost ::精神递归命令c 语法:boost_fusion_adapt_struct失败
- 当我使用 boost 构建绝对路径时,无限递归
- 使用boost递归地将给定目录中每个最低级别文件夹的文件复制到另一个目录-C++
- Qt vs Boost 文件系统递归文件计数
- 递归匹配与 boost 正则表达式库
- boost::variant:具有递归向量类型的奇怪行为
- 正在分析boost::spirit上的递归结构
- 带有boost变量递归包装器的字符串解析器
- 使用BOOST _PP_SEQ_FOREACH _R递归处理枚举
- 如何在mpl::list中声明boost递归变体
- c++ Boost递归变量重载apply_visitor
- 让static_visitor在遍历Boost递归变量时修改它