2010-11-11 3 views
19

Le code suivant fonctionne très bienstd :: bind surcharge résolution

#include <functional> 

using namespace std; 
using namespace std::placeholders; 

class A 
{ 
    int operator()(int i, int j) { return i - j; } 
}; 

A a; 
auto aBind = bind(&A::operator(), ref(a), _2, _1); 

Cela ne

#include <functional> 

using namespace std; 
using namespace std::placeholders; 

class A 
{ 
    int operator()(int i, int j) { return i - j; } 
    int operator()(int i) { return -i; } 
}; 

A a; 
auto aBind = bind(&A::operator(), ref(a), _2, _1); 

J'ai essayé de jouer avec la syntaxe pour tenter de résoudre explicitement quelle fonction que je veux dans la code qui ne fonctionne pas sans chance jusqu'à présent. Comment écrire la ligne de liaison pour choisir l'appel qui prend les deux arguments entiers?

+5

'a :: operator()' ne se réfère pas à une seule fonction, mais à une famille de fonctions: I pense que vous devez vous lancer pour «sélectionner» la bonne surcharge. Je ne valide pas ceci comme réponse car je ne suis pas familier avec C++ 0x et je ne devrais pas être au courant d'une solution plus élégante. – icecrime

Répondre

37

Vous avez besoin d'un casting à la fonction surchargée désambiguïser:

(int(A::*)(int,int))&A::operator() 
+0

Merci, ça marche. – bpw1621

7

Si vous avez C++ 11 disponible, vous devriez préférer lambdas sur std :: bind car il se traduit généralement par un code qui est plus lisible:

auto aBind = [&a](int i, int j){ return a(i, j); }; 

par rapport à

auto aBind = std::bind(static_cast<int(A::*)(int,int)>(&A::operator()), std::ref(a), std::placeholders::_2, std::placeholders::_1); 
Questions connexes