Bonsoir,
En voulant implémenter les algorithmes de la bibliothèques standards afin de pouvoir les utiliser avec des fonctions prenant un ou plusieurs arguments, je me suis naturellement orientés vers boost/bind. Un bout de code étant plus parlant qu'une longue explication, voici ce que j'obtiens pour l'algorithe for_each, acceptant un pointeur de membre prenant lui même un argument :
Le problème est que boost::bind contient une copie interne des paramètres qu'on lui passe (ici op). DU coup l'avantage de l'utilisation de call_traits est perdu. Ma question est de savoir comment invoquer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<Iterator It, class T, class R, class Op> for_each(It first, It last, R (T::*pmf), boost::call_traits<Op>::parameter_type op) { std::for_each(first, last, boost::bind(pmf, _1, op)); }
plutôt que le code précédent lorsque call_traits<Op>::parameter_type est une référence. La spécialisation de template n'est pas vraiment une option envisageable, étant donné qu'avec un pointeur de fonction membre acceptant beaucoup de paramètres, on va devoir écrire beaucoup de code. Idem pour des structures if testant call_traits<Op>::parameter_type. Y'a-t-il une solution plus élégante ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::for_each(first, last, boost::bind(pmf, _1, cref(op)))
Merci d'avance.
Partager