Amonchakai | Bonjour,
Je cherche à faire les exercices proposés dans la doc de la mpl de boost. Et j'avoue avoir un problème avec le suivant :
Citation :
Build a lambda expression that has functionality equivalent to twice. Hint: mpl::apply is a metafunction!
|
twice prenant deux paramètres f et x et calcule (f o f)(x)
Sans passer par une fonction anonyme on peux facilement faire ça :
Code :
- template<typename F, typename X>
- struct Twice_lambda :
- boost::mpl::apply<F, typename boost::mpl::apply<F, X>::type >
- {};
- // et à l'utilisation
- typedef Twice_lambda<boost::add_pointer<_1>, int>::type calc_pointer;
|
Mon problème est sur la réalisation de la fonction lambda. Comme elle est anonyme je veux la mettre directement dans un boost apply comme ça:
Code :
- typedef boost::mpl::apply<
- boost::mpl::apply<
- _1,
- typename boost::mpl::apply<_1, _2>::type
- >,
- boost::add_pointer<_>
- , int
- >::type calc_pointer;
|
le problème c'est j'ai l'impression que le compilo se perd dans les placeholders. Il me sort :
Citation :
d:\libc++\boost_1_35_0\boost\mpl\aux_\preprocessed\plain\apply_wrap.hpp(48) : error C2039: 'boost::mpl::apply<F,T1>' : is not a member of 'boost::mpl::apply<F,T1>'
with
[
F=boost::add_pointer<boost::mpl::_>,
T1=int
]
and
[
F=boost::mpl::_1,
T1=boost::mpl::_2
]
d:\libc++\boost_1_35_0\boost\mpl\aux_\preprocessed\plain\apply.hpp(63) : see reference to class template instantiation 'boost::mpl::apply_wrap2<F,T1,T2>' being compiled
with
[
F=boost::mpl::apply<boost::mpl::_1,boost::mpl::_2>,
T1=boost::add_pointer<boost::mpl::_>,
T2=int
]
d:\libc++\boost_1_35_0\boost\mpl\aux_\preprocessed\plain\apply.hpp(71) : see reference to class template instantiation 'boost::mpl::apply2<F,T1,T2>' being compiled
with
[
F=boost::mpl::apply<boost::mpl::_1,boost::mpl::_2>,
T1=boost::add_pointer<boost::mpl::_>,
T2=int
]
d:\projets\visual studio 2005\projects\metaprog\metaprog\main.cpp(50) : see reference to class template instantiation 'boost::mpl::apply<F,T1,T2>' being compiled
with
[
F=boost::mpl::apply<boost::mpl::_1,boost::mpl::_2>,
T1=boost::add_pointer<boost::mpl::_>,
T2=int
]
|
j'ai l'impression qu'il arrive pas a bien tout remplacer, surtout que tout doit a priori se faire en deux étapes : - le remplacement des _1 par les boost::add_pointer<_>
- le remplacement du reste par les int...
Et je pense donc que c'est là que se trouve le problème, il peut pas faire tout en une passe. Et donc du coup, je vois pas trop comment faire une fonction lambda qui dans ses paramètres prend la métafonction avec laquelle elle doit travailler...
Si vous avez une idée |