2015-11-06 22 views
6

Se ho bisogno di generare un lambda che chiama una funzione membro, dovrei catturare per riferimento o catturare 'questo'? La mia comprensione è che '&' cattura solo le variabili utilizzate, ma 'questo' cattura tutte le variabili membro. Quindi meglio usare '&'?C++ lambda cattura questo vs cattura per riferimento

class MyClass { 
    public: 
    int mFunc() { 
     // accesses member variables 
    } 

    std::function<int()> get() { 
     //return [this]() { return this->mFunc(); }; 
     // or 
     //return [&]() { return this->mFunc(); }; 
    } 

    private: 
    // member variables 
} 

risposta

5

Per l'esempio specifico che hai fornito, catturare per this è quello che vuoi. Concettualmente, catturare this per riferimento non ha molto senso, dal momento che non è possibile modificare il valore di this, è possibile utilizzarlo solo come puntatore per accedere ai membri della classe o per ottenere l'indirizzo dell'istanza di classe . All'interno della funzione lambda, se accedete a cose che implicitamente utilizzano il puntatore this (ad esempio chiamate una funzione membro o accedete a una variabile membro senza utilizzare esplicitamente this), il compilatore lo considera come se aveste usato lo this. Puoi anche elencare più acquisizioni, quindi se vuoi catturare sia i membri che le variabili locali, puoi scegliere indipendentemente se catturarli per riferimento o per valore. Il seguente articolo dovrebbe darvi una buona base di lambda e catture:

https://crascit.com/2015/03/01/lambdas-for-lunch/

Inoltre, il vostro esempio utilizza std::function come tipo di ritorno attraverso il quale il lambda viene passato al chiamante. Si noti che std::function non è sempre così economico come si potrebbe pensare, quindi se si è in grado di utilizzare direttamente un lambda piuttosto che doverlo racchiudere in un std::function, sarà probabilmente più efficiente. Il seguente articolo, pur non essendo direttamente correlato alla tua domanda originale, potrebbe comunque fornirti del materiale utile relativo a lambda e std::function (vedi la sezione Un modo alternativo per memorizzare l'oggetto funzione, ma l'articolo in generale potrebbe essere di interesse) :

https://crascit.com/2015/06/03/on-leaving-scope-part-2/

+0

Grazie, dare un'occhiata. –

1

Acquisizione this e catturare con riferimento sono due concetti ortogonali. Puoi usare uno, entrambi o nessuno. Non ha senso acquisire this come riferimento, ma è possibile acquisire altre variabili per riferimento durante l'acquisizione di this in base al valore.

1

Here è una buona spiegazione di cosa &, this e gli altri indicano quando viene utilizzato nell'elenco di acquisizione.

Nel tuo caso, partendo dal presupposto che tutto quello che dovete fare è chiamare una funzione membro dell'istanza che è in realtà riferimento il this del metodo che è attualmente in esecuzione, mettere this nella vostra lista di cattura dovrebbe essere sufficiente.