Ho il seguente:Specificare una funzione di membro come un callback in C++ 11
typedef std::function<bool (const std::string&)> SomethingCoolCb;
class ClassA
{
public:
void OnSomethingCool(const SomethingCoolCb& cb)
{
_cb = cb;
}
private:
SomethingCoolCb _cb;
};
class ClassB
{
public:
ClassB();
bool Juggle(const std::string& arg);
private:
ClassA _obj;
};
e voglio specificare la funzione di membro ClassB :: Juggle() come callback per ClassB :: _ obj. Sarebbe il modo corretto per farlo in C++ 11 essere (nel costruttore di ClassB):
ClassB::ClassB()
{
_obj.OnDoSomethingCool(
[&](const std::string& arg) -> bool
{
return Juggle(arg);
});
}
Da quello che ho capito, il compilatore farà un oggetto std :: funzione di fuori del codice Lambda sopra. Quindi, quando viene richiamato il callback, chiamerà il membro std :: function :: operator() e quindi invocherà ClassB :: Juggle() invece di richiamare direttamente ClassB :: Juggle(). A meno che non mi sbagli su cosa succede sotto le coperte, tutto sembra essere un po 'inefficiente. C'è un modo migliore?
Attenzione che catturare 'this' in una lambda (come nel tuo esempio) non funziona bene con Visual Studio 2010. –