#include #include #include #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_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="<(f_ptr)) Field(a_field); my_offsets.push_back(f_offset); } Abstract const& operator[](unsigned i)const { char const*b_ptr=&my_storage.begin()[0]; char const*c_ptr=b_ptr+my_offsets[i]; void const*v_ptr=static_cast(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)); std::cout<<"cont(2,2,0):\n"; std::cout<