std::async с перегруженными функциями
Возможный дубликат:
Рассмотрим следующий пример 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 я выясняю решение своего вопроса. Есть два способа сделать это (по мне).
С помощью
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);
Непосредственно используя вышеуказанную функцию привязки
auto f = std::async(std::launch::async, (int(A::*)(int, double))&A::foo, &a, 2, 3.5)