std::async с перегруженными функциями

Возможный дубликат:

разрешение перегрузки std::bind

Рассмотрим следующий пример C++

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

Это дает 'std::async': невозможно вывести аргумент шаблона, так как аргумент функции неоднозначен. Как мне решить эту двусмысленность??

2 ответа

Решение

Помогите компилятору разрешить неоднозначность, сообщая, какую перегрузку вы хотите:

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

или используйте вместо этого лямбда-выражение:

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

С помощью разрешения перегрузки std::bind я выясняю решение своего вопроса. Есть два способа сделать это (по мне).

  1. С помощью 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. Непосредственно используя вышеуказанную функцию привязки

    auto f = std::async(std::launch::async, (int(A::*)(int, double))&A::foo, &a, 2, 3.5)
    
Другие вопросы по тегам