Boost logo

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