разрешение перегрузки std :: bind - PullRequest
23 голосов
/ 12 ноября 2010

Следующий код работает нормально

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

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

Ответы [ 3 ]

42 голосов
/ 12 ноября 2010

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

(int(A::*)(int,int))&A::operator()
17 голосов
/ 18 марта 2016

Если у вас есть C ++ 11, вам следует отдавать предпочтение лямбдам вместо 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);
0 голосов
/ 29 мая 2019

Существует несколько макросов "lift", которые автоматизируют передачу наборов перегрузки в качестве параметров, помещая их в лямбду, которая просто пересылает все передаваемые ему параметры.Тот, который предоставляется Boost, может заставить код скомпилироваться с помощью

#include <boost/hof/lift.hpp>

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

. Существуют также предложения по упрощению передачи наборов перегрузки, см., Например, P0834 , но я не знаюнайдет ли это или нашло ли согласие.

...