2012-05-12 15 views
8

Ho una funzione di callback C++ funzionante, attivata da un evento 'mouse down' dell'utente. (L'IDE è VS2010.)Best practice per ambito variabile locale in un callback C++

Ad ogni chiamata, desidero incrementare una variabile di conteggio semplice locale per l'ambito del callback. In poche parole, qual è il modo migliore per fare questo?

Grazie in anticipo per eventuali opinioni o direttive.

+2

Se si desidera questa variabile solo nella funzione di callback, una variabile statica è ciò che si desidera. – Geoffroy

+0

è possibile utilizzare una variabile statica, ma prestare particolare attenzione al suo utilizzo in generale – maress

risposta

13

Sostituisci la funzione di richiamata con un funtore - possono memorizzare lo stato. Un esempio funtore:

#include <iostream> 
#include <memory> 

class Functor 
{ 
private: 
    std::shared_ptr<int> m_count; 

public: 
    Functor() 
    : m_count(new int(0)) 
    {} 

    void operator()() 
    { 
     ++(*m_count); 
     // do other stuff... 
    } 

    int count() const 
    { 
     return *m_count; 
    } 
}; 

template <typename F> 
void f(F callback) 
{ 
    // do stuff 
    callback(); 
    // do other stuff 
} 

int main() 
{ 
    Functor callback; 
    f(callback); 
    f(callback); 
    std::cout << callback.count(); // prints 2 
    return 0; 
} 

Nota l'uso di un shared_ptr all'interno del funtore - questo è perché f ha una copia locale del funtore (notare il passaggio per valore) e si desidera che la copia di condividere la sua int con il funtore a cui si ha accesso. Si noti inoltre che f deve prendere il suo argomento in base al valore, dal momento che si desidera supportare tutti i chiamabili, e non solo i funtori.

+0

è necessario votare per l'utilizzo banale di un puntatore condiviso nell'esempio? Una semplice variabile membro int sarebbe più che sufficiente – maress

+2

@maress: leggere prima la spiegazione e poi decidere. –

+1

inoltre, il destinatario del callback potrebbe essere un oggetto che richiede semantica della copia (ad esempio qualcosa che memorizza tutte le callback in un contenitore di libreria standard) – juanchopanza