Amonchakai | Bonjour,
Depuis quelques temps j'essaye de me mettre à la MPL de boost. Ca fait mal à la tête mais c'est intéressant Je suis donc en train de faire les exercices qui sont proposé à la fin des tutoriaux de la doc. Et donc je suis sur le premier : vérifier qu'une séquence ne contiennent que des nombres égaux à 0 ou 1.
Bon, j'y suis presque :
Code :
- typedef boost::mpl::vector_c<int, 0, 0, 1, 0, 2, 0> test_seq;
- struct Check {
- template<typename PrevAns, typename CurrElm>
- struct apply {
- typedef typename boost::mpl::if_<
- boost::mpl::or_<
- boost::is_same<CurrElm, boost::mpl::integral_c<int, 0> >,
- boost::is_same<CurrElm, boost::mpl::integral_c<int, 1> >
- >,
- PrevAns,
- boost::mpl::next<PrevAns>
- >::type type;
- };
- };
- template<typename Seq>
- struct binary {
- typedef typename boost::mpl::fold<
- Seq,
- boost::mpl::int_<0>,
- Check
- >::type type;
- // BOOST_MPL_ASSERT_RELATION( type::value, ==, 0 ) ;
- typedef typename boost::mpl::deref<type>::type derefType;
- enum val {value = derefType::value };
- };
- int main(int argc, char **argv) {
- std::cout<<binary<test_seq>::value;
- return 0;
- }
|
mon problème, se trouve que je voulais compter le nombre d'éléments qui sont différents de 0 ou 1. Pour ça j'utilise le type que me retourne le fold. A chaque fois, je renvois le int_<> suivant du nombre précédent d'éléments trouvé. Le problème c'est que cela semble marcher qu'une seule fois. En effet, si il y a un seul nombre qui ne vérifie pas la condition ça marche. Mais par contre si j'en ai deux, j'ai une erreur de compil.
Le compilo m'annonçant
Citation :
'value' is not a member of "boost::mpl::next<mpl_::int_<0> >"
|
donc je sais pas trop, il a l'air de bloquer au moment du déréférençage de l'itérateur... Si vous avez une idée
|