
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_sto... 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_st... 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