#include #include #include #include #include #include struct polymorphic_object { virtual ~polymorphic_object(){} virtual void print(std::ostream&sout)const=0; }; typedef boost::mpl::vector object_types; template struct polymorphic_derived : polymorphic_object { typedef typename boost::mpl::at_c::type value_type; value_type my_value; polymorphic_derived(value_type const&a_value=value_type()) : my_value(a_value) { } void print(std::ostream&sout)const { sout<<"polymorphic_derived<"<("< struct polymorphic_derived<1> : polymorphic_object { static unsigned const Itype=1; typedef char value_type; value_type my_value; polymorphic_derived(char a_value='a') : my_value(a_value) { } void print(std::ostream&sout)const { sout<<"polymorphic_derived<"<("< struct polymorphic_container { std::vector my_storage //storage for fields ; std::vector my_offsets //field offsets ; template void push_back ( Field const& a_field ) { std::size_t now_size=my_storage.size(); std::cout<<"now_size="<(c_ptr); Abstract const*a_ptr=static_cast(v_ptr); return *a_ptr; } }; std::ostream& operator<< ( std::ostream& sout , polymorphic_container const& x ) { sout<<"{ "; unsigned const n=x.my_offsets.size(); for(unsigned i=0; i cont; std::cout<<"cont(empty):\n"; std::cout<(100.01)); cont.push_back(polymorphic_derived<2>(200.02)); cont.push_back(polymorphic_derived<0>(300)); cont.push_back(polymorphic_derived<1>('c')); std::cout<<"cont.push_backs:\n"; std::cout<