#include namespace boost { template < class Prop1, class Prop2 > struct composite_property { composite_property (Prop1 p1_, Prop2 p2_):p1 (p1_), p2 (p2_) { } Prop1 p1; Prop2 p2; }; template < class Prop1, class Prop2 > struct property_traits > { typedef typename property_traits < Prop2 >::key_type key_type; typedef typename property_traits < Prop2 >::value_type value_type; }; } template < class Prop1, class Prop2 > void put (boost::composite_property < Prop1, Prop2 > comp, typename boost::property_traits < Prop2 >::key_type x, typename boost::property_traits < Prop1 >::value_type value) { put (comp.p1, get (comp.p2, x), value); } template < class Prop1, class Prop2 > typename boost::property_traits < Prop1 >::key_type get (boost::composite_property < Prop1, Prop2 > comp, typename boost::property_traits < Prop2 >::key_type x) { return get (comp.p1, get (comp.p2, x)); }