2013-02-16 34 views
5

Si consideri la seguente classe:std :: asincrona richiamo della funzione membro

class Foo 
{ 
    private: 
     void bar(const size_t); 
    public: 
     void foo(); 
}; 

ora Foo::foo() dovrebbe iniziare le discussioni esecuzione bar, quindi questo è come è implementato:

void Foo:foo() 
{ 
    auto handle = std::async(std::launch::async, &Foo::bar, this, 0); 
    handle.get(); 
} 

Questo funziona perfettamente con g ++ -4.6.3, ma non con g ++ - 4.5.2, il messaggio di errore è

include/c++/4.5.2/functional:180:9: Error: must use ».« or »->« to call pointer-to-member function in »std::declval with _Tp = void (Foo::*)(long unsigned int), typename std::add_rvalue_reference<_Tp>::type = void (Foo::&&)(long unsigned int) (...)«, e.g. »(... -> std::declval with _Tp = void (Foo::*)(long unsigned int), typename std::add_rvalue_reference<_Tp>::type = void (Foo::*&&)(long unsigned int)) (...)«

Quindi ovviamente l'errore si trova nella vecchia versione di g ++. E 'possibile ovviare a questo problema, rendendo il metodo pubblico e introdurre la seguente funzione di supporto:

void barHelp(Foo* foo, const size_t n) 
{ 
    foo->bar(n); 
} 
void Foo:foo() 
{ 
    auto handle = std::async(std::launch::async, barHelp, this, 0); 
    handle.get(); 
} 

Tuttavia, facendo un metodo pubblico non è la migliore decisione di progettazione. C'è un altro modo per aggirare questo problema senza cambiando il compilatore e lasciando il metodo privato?

risposta

9

Il problema sembra essere che non funzionerà correttamente con le funzioni membro. Forse si può std::bind la funzione di membro per primo l'oggetto, prima di passarlo al std::async:

auto func = std::bind(&Foo::bar, this, std::placeholders::_1); 
auto handle = std::async(std::launch::async, func, 0); 
+0

funziona bene, grazie! – stefan

Problemi correlati