2010-11-11 11 views
19

El siguiente código funciona bienstd :: bind

#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); 

Esto no

#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); 

He tratado de jugar con la sintaxis para tratar de resolver de forma explícita que funcionan en el que quiero código que no funciona sin suerte hasta el momento. ¿Cómo escribo la línea de enlace para elegir la llamada que toma los dos argumentos enteros?

+5

':: un operador()' no se refiere a una sola función, pero a una familia de funciones: I piense que tiene que lanzarlo para 'seleccionar' la sobrecarga correcta. No estoy validando esto como una respuesta ya que no estoy familiarizado con C++ 0x y es posible que no tenga conocimiento de una solución más elegante. – icecrime

Respuesta

37

Se necesita un molde para eliminar la ambigüedad de la función sobrecargada:

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

Gracias, lo tengo funcionando. – bpw1621

7

Si tiene C++ 11 disponibles se debe preferir lambdas sobre std :: bind ya que por lo general se traduce en código que es más fácil de leer:

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

comparación con

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