Boost logo

Boost Users :

Subject: Re: [Boost-users] generate structs with all combinations of members from a given struct
From: Larry Evans (cppljevans_at_[hidden])
Date: 2010-01-30 08:35:18


On 01/30/10 00:37, Hicham Mouline wrote:
> Hello,
>
> struct params {
> double field1;
> double field2;
> double field3;
> double fiedl4;
> };
>
> I would like to generate all the types that hold any combination of the
> members of params.
>
> struct params_field1 {
> double field1;
> };
> struct params_field2 {
> double field2;
> };
> struct params_field3 {
> double field3;
> };
> struct params_field4 {
> double field4;
> };
> struct params_field1_field2 {
> double field1;
> double field2;
> };
> struct params_field1_field3 {
> double field1;
> double field3;
> };
> struct params_field1_field4 {
> double field1;
> double field4;
> };
> struct params_field2_field3 {
> double field2;
> double field3;
> };
> struct params_field2_field4 {
> double field2;
> double field4;
> };
> struct params_field3_field4 {
> double field3;
> double field4;
> };
> struct params_field1_field2_field3 {
> double field1;
> double field2;
> double field3;
> };
> struct params_field1_field2_field4 {
> double field1;
> double field2;
> double field4;
> };
> struct params_field1_field3_field4 {
> double field1;
> double field3;
> double field4;
> };
> struct params_field2_field3_field4 {
> double field2;
> double field3;
> double field4;
> };
> struct params_field1_field2_field3_field4 {
> double field1;
> double field2;
> double field3;
> double field4;
> };
>
> There are 15 of these, which is 2^4 -1, where 4 is the number of members
> in params.
>
> Assuming params is adapted as a fusion sequence, this looks doable with PP?
> Should I be looking at BOOST_PP_LIST_FOLD_xxx macros?
>

I think the following might work:

   step1:
     create sequence of fields:
       seq=(field1,field2,...,fieldn)
   step2:
     create a sequence of a sequence of fields by fold with pop_back:
       seq_fold=
       ( (field1,field2,....,fieldn)
       , (field1,field2,...,fieldn-1)
       ...
       , (field1)
       )
   step3
     form the cross product of seq_fold using code posted
     here:
 
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?CPPTM_Answers_-_Exercise_7-8

     or, if using variadic templates compiler is OK for you,
     in list_comprehension.cpp here:

http://www.boostpro.com/vault/index.php?&directory=variadic_templates

WARNING. I haven't tried this at all. but it seems it should work.

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