150 votes

Comment spécifier un pointeur vers une fonction surchargée ?

Je veux passer une fonction surchargée à la fonction std::for_each() algorithme. Par exemple,

class A {
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f);
    }
};

Je m'attendrais à ce que le compilateur résolve f() par le type d'itérateur. Apparemment, il (GCC 4.1.2) ne le fait pas. Donc, comment puis-je spécifier quel f() Je veux ?

4voto

Matthew Points 71

Si l'utilisation de C++11 ne vous dérange pas, voici une aide intelligente qui est similaire (mais moins laide) au static cast :

template<class... Args, class T, class R>
auto resolve(R (T::*m)(Args...)) -> decltype(m)
{ return m; }

template<class T, class R>
auto resolve(R (T::*m)(void)) -> decltype(m)
{ return m; }

(Cela fonctionne pour les fonctions membres ; il devrait être évident de le modifier pour qu'il fonctionne pour les fonctions indépendantes, et vous pouvez le faire. devrait être en mesure de fournir les deux versions et le compilateur sélectionnera la bonne pour vous).

Merci à Miro Knejp pour sa suggestion : voir aussi https://groups.google.com/a/isocpp.org/d/msg/std-discussion/rLVGeGUXsK0/IGj9dKmSyx4J .

0 votes

Le problème de l'OP est de ne pas pouvoir passer un nom surchargé dans un modèle de fonction, et votre solution consiste à passer un nom surchargé dans un modèle de fonction ? C'est exactement le même problème.

1 votes

@Barry Pas le même problème. La déduction des arguments du modèle réussit dans ce cas. Il fonctionne (avec quelques modifications mineures).

0 votes

@Oktalist Parce que vous fournissez R il n'est pas déduit. Cette réponse n'en fait pas non plus mention.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X