2014-11-20 14 views
7

Eventuali duplicati:std :: asincrone con funzioni di overload

std::bind overload resolution

Considerare seguente C++ esempio

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

Questo dà 'std :: asincrone': non può dedurre l'argomento template come argomento della funzione è ambiguo. Come posso risolvere questa ambiguità ??

risposta

9

Aiuto l'ambiguità dire compilatore determinazione che sovraccarico si desidera:

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

o l'uso dell'espressione lambda invece:

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

funzione Quando sto usando l'expressionauto lambda 'f = std :: asincrona (std: : launch :: async, [& a] {a.foo (2, 3.5);}); int x = f.get(); 'non funziona. C'è qualche modo particolare di ottenere il valore? –

+2

@AmithChinthaka 'return a.foo (2, 3.5);' –

2

Con l'aiuto di std::bind overload resolution ho dato una soluzione per la mia domanda. Ci sono due modi per farlo (secondo me).

  1. Utilizzando 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. Direttamente usando sopra vincolante

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