I am making small progress in my attempt to generate a new mpl sequence that I will use to read from  a stream.

 

The following code fails to compile:

 

#include <boost/tuple/tuple.hpp>

#include <boost/mpl/vector_c.hpp>

#include <boost/mpl/transform.hpp>

#include <boost/fusion/adapted/struct/adapt_struct.hpp>

#include <boost/fusion/include/adapt_struct.hpp>

#include <boost/fusion/mpl.hpp>                  // makes params a MPL sequence

#include <boost/fusion/support/is_sequence.hpp>

#include <boost/fusion/include/is_sequence.hpp>

 

struct params {

  double       d1;

  double       d2;                 

  double       d3;                 

  unsigned int i4;

  unsigned int i5;

  unsigned int i6;

  unsigned int i7;

};

 

BOOST_FUSION_ADAPT_STRUCT(

  params,

  (double, d1)

  (double, d2)

  (double, d3)

  (unsigned int, i4)

  (unsigned int, i5)

  (unsigned int, i6)

  (unsigned int, i7)

)

 

BOOST_MPL_ASSERT(( boost::fusion::traits::is_sequence<params> ));  // passes

 

template <typename T1>

struct rangify {

  typedef boost::tuple<T1, T1, T1> type;   /// min max incr

};

 

template <typename T>

struct fixed_or_range {

  typedef struct {

    union {

     T                         fixed;

     typename rangify<T>::type range;

    };

    bool is_fixed;

  }

  type;

};

 

 

typedef boost::mpl::transform< params, fixed_or_range<boost::mpl::_> >::type params_fixed_or_range;

 

I understand that after the macro BOOST_FUSION_ADAPT_STRUCT , params is a fusion sequence.

Including <boost/fusion/mpl.hpp> made params a MPL sequence, and therefore I can call boost::mpl::transform<>  on it.

 

The compilation error is

 

c:\program files (x86)\boost_1_41_0\boost\mpl\clear.hpp(30) : error C2903: 'apply' : symbol is neither a class template nor a function template

1>        c:\program files (x86)\boost_1_41_0\boost\mpl\transform.hpp(113) : see reference to class template instantiation 'boost::mpl::clear<Sequence>' being compiled

1>        with

1>        [

1>            Sequence=params

1>        ]

1>        c:\program files (x86)\boost_1_41_0\boost\mpl\eval_if.hpp(41) : see reference to class template instantiation 'boost::mpl::transform1<P1,P2,P3>' being compiled

1>        with

1>        [

1>            P1=params,

1>            P2=fixed_or_range<boost::mpl::_1>,

1>            P3=boost::mpl::na

1>        ]

1>        c:\program files (x86)\boost_1_41_0\boost\mpl\transform.hpp(138) : see reference to class template instantiation 'boost::mpl::eval_if<C,F1,F2>' being compiled

1>        with

1>        [

1>            C=boost::mpl::or_<boost::mpl::is_na<boost::mpl::na>,boost::mpl::is_lambda_expression<fixed_or_range<boost::mpl::_1>>,boost::mpl::not_<boost::mpl::is_sequence<fixed_or_range<boost::mpl::_1>>>>,

1>            F1=boost::mpl::transform1<params,fixed_or_range<boost::mpl::_1>,boost::mpl::na>,

1>            F2=boost::mpl::transform2<params,fixed_or_range<boost::mpl::_1>,boost::mpl::na,boost::mpl::na>

1>        ]

1>        c:\users\hich\documents\visual studio 2008\projects\test\test1\main.cpp(51) : see reference to class template instantiation 'boost::mpl::transform<Seq1,Seq2OrOperation>' being compiled

1>        with

1>        [

1>            Seq1=params,

1>            Seq2OrOperation=fixed_or_range<boost::mpl::_1>

1>        ]

 

Regards,