//demo a simple recursive variant using fusion sequence container. // #include "boost/variant.hpp" #include "boost/blank.hpp" #include "boost/fusion/container/vector.hpp" #include "boost/fusion/include/at_c.hpp" #include #include template struct list_var ; template struct list_bounded : boost::fusion::vector < T , boost::recursive_wrapper > > { typedef boost::fusion::vector < T , boost::recursive_wrapper > > super_t ; static constexpr char const* class_name="list_bounded" ; list_bounded ( T a_head , list_varconst& a_tail ) : super_t ( a_head , a_tail ) { std::cout<&& a_tail ) : super_t ( a_head , std::forward >(a_tail) ) { std::cout< struct list_var : boost::variant < boost::blank , list_bounded > { typedef boost::variant < boost::blank , list_bounded > super_t ; list_var() {} template list_var(U const&&u) : super_t(std::move(u)) {} }; struct list_printer : boost::static_visitor { std::ostream& ost; list_printer(std::ostream& a_out):ost(a_out) {} void operator()(const boost::blank&) const { ost << "(blank) "; } template void operator()(const list_bounded& lst) const { ost << "( "; ost << boost::fusion::at_c<0>(lst) <<", "; const boost::recursive_wrapper >&rw=boost::fusion::at_c<1>(lst); const list_var*ptr=rw.get_pointer(); if(ptr) { boost::apply_visitor( *this, *ptr); } else { ost<<"static_castconst*>()"; } ost << ") "; } }; template< typename T> std::ostream& operator<< ( std::ostream& sout , list_varconst& a_list ) { list_printer prtr(sout); boost::apply_visitor( prtr, a_list); return sout; } int main() { typedef list_var list_int_t; list_int_t list_empty; std::cout << __LINE__<<":list_empty constructed which="<( 1, list_empty)); std::cout << __LINE__<<":list_empty copied which="<( 2, std::move(list_1))); std::cout << __LINE__<<":list_1 moved which="<