2010-11-11 1 views
19

Следующий код работает отличностанд :: привязывать разрешение перегрузки

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

Это не

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

Я пытался играть с синтаксисом, чтобы попытаться явно решить, какие функции я хочу в код, который пока не работает без удачи. Как написать строку привязки, чтобы выбрать вызов, который принимает два целых аргумента?

+5

'A :: оператор()' не относится к одной функции, но семейство функций: I подумайте, что вам нужно отбросить его, чтобы «выбрать» правильную перегрузку. Я не проверяю это как ответ, поскольку я не знаком с C++ 0x, и я, возможно, не знаю более элегантного решения. – icecrime

ответ

37

Вам нужен бросок к неоднозначности перегруженной функции:

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

Спасибо, заработал. – bpw1621

7

Если у вас есть C++ 11 доступны вам следует предпочесть лямбды над стандом :: связывать, так как это обычно приводит к коду, который является более удобным для чтения:

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

по сравнению с

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

 Смежные вопросы

  • Нет связанных вопросов^_^