std::bind overload resolution

后端 未结 3 1616
醉梦人生
醉梦人生 2020-11-28 14:00

The following code works fine

#include 

using namespace std;
using namespace std::placeholders;

class A
{
  int operator()( int i, int j          


        
相关标签:
3条回答
  • 2020-11-28 14:57

    There are some "lift" macros available that automate passing overload sets as parameters by wrapping them into a lambda that simply forwards all parameters passed to it. One that is provided by Boost can make the code compile via

    #include <boost/hof/lift.hpp>
    
    auto aBind = bind(BOOST_HOF_LIFT(&A::operator()), ref(a), _2, _1 );
    

    There are also proposals for making it easier to pass overload sets, see e.g. P0834, but I don't know whether this will find or found consensus.

    0 讨论(0)
  • 2020-11-28 15:00

    You need a cast to disambiguate the overloaded function:

    (int(A::*)(int,int))&A::operator()
    
    0 讨论(0)
  • 2020-11-28 15:02

    If you have C++11 available you should prefer lambdas over std::bind since it usually results in code that is more readable:

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

    compared to

    auto aBind = std::bind(static_cast<int(A::*)(int,int)>(&A::operator()), std::ref(a), std::placeholders::_2, std::placeholders::_1);
    
    0 讨论(0)
提交回复
热议问题