Подтвердить что ты не робот

Std:: 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 );

Это не

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

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

4b9b3361

Ответ 1

Вам нужно бросить, чтобы устранить перегруженную функцию:

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

Ответ 2

Если у вас есть С++ 11, вы должны предпочесть lambdas над std::bind поскольку он обычно приводит к более читаемому коду:

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