この再帰バリアントを機能させるにはどうすればよいですか? バリアントのコンテナ、またはバリアントのコンテナのコンテナが欲しいです。
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'