std :: bind重载决议

时间:2010-11-11 21:33:13

标签: c++ c++11 functional-programming std

以下代码可以正常使用

#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 个答案:

答案 0 :(得分:42)

您需要使用强制转换来消除重载函数的歧义:

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

答案 1 :(得分:17)

如果你有C ++ 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);

答案 2 :(得分:0)

有一些可用的“提升”宏,它们通过将重载集包装到一个lambda中来自动将传递的重载参数作为参数,该lambda只是转发传递给它的所有参数。 Boost提供的代码可以使代码通过

进行编译
#include <boost/hof/lift.hpp>

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

还有一些建议可以使传递过载集更容易,例如参见P0834,但我不知道这是否会达成共识。