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,