std::async with overloaded functions

2.4k views Asked by At

Possible Duplicate:

std::bind overload resolution

Consider following C++ example

class A
{
public:
    int foo(int a, int b);
    int foo(int a, double b);
};

int main()
{
    A a;
    auto f = std::async(std::launch::async, &A::foo, &a, 2, 3.5);
}

This gives 'std::async' : cannot deduce template argument as function argument is ambiguous. How do I resolve this ambiguity??

2

There are 2 answers

2
Piotr Skotnicki On BEST ANSWER

Help the compiler resolve ambiguity telling which overload you want:

std::async(std::launch::async, static_cast<int(A::*)(int,double)>(&A::foo), &a, 2, 3.5);
//                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

or use lambda expression instead:

std::async(std::launch::async, [&a] { return a.foo(2, 3.5); });
0
Amith Chinthaka On

With the help of std::bind overload resolution I figure out a solution for my question. There are two way of doing this (according to me).

  1. Using std::bind

    std::function<int(int,double)> func = std::bind((int(A::*)(int,double))&A::foo,&a,std::placeholders::_1,std::placeholders::_2);
    auto f = std::async(std::launch::async, func, 2, 3.5);
    
  2. Directly using above function binding

    auto f = std::async(std::launch::async, (int(A::*)(int, double))&A::foo, &a, 2, 3.5)