|
Boost Users : |
Subject: Re: [Boost-users] [MPL] initialization of member that might be non-copyable
From: Noah Roberts (roberts.noah_at_[hidden])
Date: 2011-03-25 16:53:13
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>
// > ...
// >
};
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net