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 >::type >
{
static typename Field::type apply(Params & params)
{
return get<Field>(params);
}
};
template < typename FieldValue, typename Params >
FieldValue init_field(Params & pars)
{
return initializer::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
// > ...
// >
};