Boost logo

Boost Users :

Subject: Re: [Boost-users] [MPL] initialization of member that might be non-copyable
From: Larry Evans (cppljevans_at_[hidden])
Date: 2011-04-04 15:30:41


On 04/03/11 13:59, Larry Evans wrote:
> On 03/25/11 15:53, Noah Roberts wrote:
>> 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:
> [snip]
> Hi Noah,
>
> Are you having any luck with this? I'd liks to see how you've
> done it and/or what difficulties you had doing it.
>
> TIA.
>
> -Larry

The code here:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/libs/composite_storage/sandbox/pack/composite_storage.leaf.test.cpp

has non-copyable template classes:

  template
  < unsigned I
>
  struct
charvec_double
: charvec_u<I>
{
    double d;
    charvec_double()
    : d(-1000.0-double(I))
    {}
    charvec_double(char c)
    : charvec_u<I>(c)
    , d(-100.0-double(I))
    {}
    charvec_double(double _d)
    : d(_d)
    {}
    charvec_double(char c,double _d)
    : charvec_u<I>(c)
    , d(_d)
    {}
 private:
    charvec_double(charvec_double const&)
    /**@brief
     * Disallow copy CTOR
     */
    ;
};

used as components in a heterogeneous container type:

            typedef
          pack::indexed_ctor_args_all_of_aligned
          < mpl::integral_c<index_numerals,index_0>
          , charvec_double<0>
          , charvec_double<1>
          , charvec_double<2>
          , charvec_double<3>
>
        tagged_type
        ;

and initialized, without using the copy CTOR's. Instead,
it uses something like the named parameters syntax:

  http://en.wikipedia.org/wiki/Named_parameter

where, in this case, the name for the parameters is their
index template:

  index<index_numerals,index_I>

In the test code mentioned, this appears as:

          index
          < index_numerals
          , index_0
>
        ndx0
        ;
          index
          < index_numerals
          , index_3
>
        ndx3
        ;
          tagged_type
        tagged_arg
        ( ndx3=double(1000.3) //show out-of-order initialization
        , ndx0='x'
      #if 1
        , index<index_numerals,index_2>() = 'z'
      #else
        //This should produce compile-time error because of multiple
index_0 associations.
        , ndx0='z'
      #endif
        )
        ;

Note the #else comments. If the same name is used more than once,
a compile error (obscure, as usual) is produced. The output
produced from the following print statements are:

    :project<index_0>=charvec_double<0>:id_get=12:v[0]=x:d=-100
    :project<index_1>=charvec_double<1>:id_get=13:v[0]=a:d=-1001
    :project<index_2>=charvec_double<2>:id_get=14:v[0]=z:d=-102
    :project<index_3>=charvec_double<3>:id_get=15:v[0]=a:d=1000.3

Of course, in real code, the index_numerals would have more meaningful
names. The heart of the solution is in:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/indexed_ctor_args_all_of_aligned.hpp

in templated CTOR:

      template
      < index_type... Keys
      , typename... CtorTypes
>
    indexed_ctor_args_all_of_aligned
      ( index_component
          < index_type
          , Keys
          , CtorTypes
>const&...
        ctor_args
      )

Here, the Keys... are the indices, and the CtorTypes... are
the types of arguments to the components associated with the
corresonding key in Keys.... The value of those componens
are, obvious, retrieved using the my_comp member variable of
the index_component<Key,CtorType> values.

HTH.

-Larry


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