
On 3/25/2011 1:48 PM, Noah Roberts wrote: [snip bad code] I posted bits that I'd been experimenting and reverted stuff without testing. Here's corrected version: template < typename Field > struct field_value { typedef Field field; typedef typename Field::type ftype; ftype value; field_value(ftype const& t) : value(t) {} field_value() : value() {} }; template < typename Field, typename Params, typename Enable = void > struct initializer { static typename Field::type apply(Params &) { return Field::type(); } }; template < typename Field, typename Params > struct initializer<Field,Params, typename boost::enable_if< boost::mpl::contains<typename Params::fields, Field> >::type > { static typename Field::type apply(Params & params) { return get<Field>(params); } }; template < typename FieldValue, typename Params > FieldValue init_field(Params & pars) { return initializer<typename FieldValue::field, Params >::apply(pars); } template < typename FieldValue, typename More > struct record_base : FieldValue, More { template < typename Params > record_base(Params & pars) : FieldValue(init_field<FieldValue>(pars)) , More(pars) {} record_base() : FieldValue(), More() {} }; struct empty_record_base { template < typename Ignored > empty_record_base(Ignored&){} empty_record_base() {} }; template < typename MplSequence > struct build_record { typedef boost::mpl::placeholders::_1 _1; typedef boost::mpl::placeholders::_2 _2; typedef typename boost::mpl::fold < MplSequence , empty_record_base , record_base< field_value<_2>, _1 > >::type type; // type should be record_base< field_value<field0> // , record_base< field_value<field1> // , ... record_base<field_value<fieldN>, empty_record_base> // > ... // > };