2013-09-29 22 views
6

E 'possibile chiamare oggetti funzione creati con std :: bind usando std :: async. Il seguente codice non riesce a compilare:Può std :: call std :: oggetti funzione asincrona?

#include <iostream> 
#include <future> 
#include <functional> 

using namespace std; 

class Adder { 
public: 
    int add(int x, int y) { 
     return x + y; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    Adder a; 
    function<int(int, int)> sumFunc = bind(&Adder::add, &a, 1, 2); 
    auto future = async(launch::async, sumFunc); // ERROR HERE 
    cout << future.get(); 
    return 0; 
} 

L'errore è:

Nessuna funzione di corrispondenza per chiamata a 'async': modello Candidato ignorato: il fallimento di sostituzione [con Fp = std :: _1: : la funzione &, Args = <>]: nessun tipo di nome 'type' in 'std :: _1 :: __ invoke_of,>

è solo non è possibile utilizzare asincrona con gli oggetti std :: funzione o sono io fare qualcosa di sbagliato?

(Questo è stato compilato utilizzando Xcode 5 con il 5.0 compilatore di Apple LLVM)

+0

dove "async" ottiene gli argomenti del functor? Prova a passare una 'std :: function '. – juanchopanza

risposta

12

E 'possibile chiamare oggetti funzione creati con std::bind utilizzando std::async

Sì, è possibile chiamare qualsiasi funtore , purché tu fornisca il giusto numero di argomenti.

sto facendo qualcosa di sbagliato?

Si sta convertendo la funzione associata, che non richiede argomenti, in un function<int(int,int)>, che accetta (e ignora) due argomenti; quindi provando a lanciarlo senza argomenti.

Si potrebbe specificare la firma corretta:

function<int()> sumFunc = bind(&Adder::add, &a, 1, 2); 

o evitare il sovraccarico di creare un function:

auto sumFunc = bind(&Adder::add, &a, 1, 2); 

o Non perdete tempo con bind affatto:

auto future = async(launch::async, &Adder::add, &a, 1, 2); 

o utilizzare un lambda:

auto future = async(launch::async, []{return a.add(1,2);}); 
Problemi correlati