Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::async with overloaded functions

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??

like image 218
Amith Chinthaka Avatar asked Nov 20 '14 06:11

Amith Chinthaka


2 Answers

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); });
like image 195
Piotr Skotnicki Avatar answered Oct 23 '22 11:10

Piotr Skotnicki


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)
    
like image 27
Amith Chinthaka Avatar answered Oct 23 '22 13:10

Amith Chinthaka