È possibile confrontare in qualche modo due oggetti std::tr1::function<>
? Cosa succede se ho una collezione di oggetti function<void(int,float)>
e voglio aggiungere e rimuovere gestori di eventi? L'aggiunta è banale, ma trovare quello da rimuovere sembra impossibile.Confronto std :: function <>
risposta
In base alle informazioni da Stack Overflow al seguente collegamento, È possibile ma solo se si avvolge l'oggetto std :: function nella propria classe.
Utilizzando una classe wrapper, è possibile verificare se due puntatori avvolti std :: funzione sono uguali, ma che non dice nulla di ciò che la funzione di std :: avvolge. Quindi, cambiare il tuo design è probabilmente un approccio migliore.
modifica: sono tornato per mostrare il modo in cui ho risolto un problema molto simile.
0) Typedef per concisione.
using std::placeholders;
typedef std::function < void (int, float) > some_func;
typedef std::pair < intptr_t, intptr_t > method_hash;
Scrivi la collezione di oggetti std :: funzione da puntatori a metodi o funzioni vincolante. Dove lo stai facendo per le funzioni statiche, ometti some_object_ptr.
some_func some_method (std::bind (some_method_ptr, some_object_ptr, _1, _2)
Usa std :: reinterpret_cast < intptr_t> per creare un hash unico per la vostra funzione, e utilizzarlo con std :: coppia di farlo per i metodi.
method_hash pairID (reinterpret_cast <intptr_t> (some_object_ptr), reinterpret_cast <intptr_t> (some_method_ptr));
Ora il tuo pairID può essere memorizzato in un vettore o altro contenitore/array. Basta essere sicuri di mantenere gli indici allineati in modo che un hash corrisponda sempre all'oggetto std :: function corretto, e si può quindi usare find() per ottenere un iteratore alla sua posizione e distance() per convertire l'iteratore in indice richiesto
Si noti che ciò deve essere eseguito ogni volta che viene generato il contenitore. Poiché si basa sui puntatori, gli hash cambieranno su diverse esecuzioni del tuo programma.
Non può essere fatto, semplicemente. std::function
(in tutte le iterazioni, incluso boost::function
e std::tr1::function
) non supporta operator==
.
@James: Non sono d'accordo. La domanda non si chiede perché non lo è, si chiede se lo è. Se vuoi trovare questa domanda, devi già sapere che non lo è. – Puppy
@DeadMG: abbastanza corretto, ma dup [Confrontare oggetti std :: tr1 :: function <>] (http://stackoverflow.com/questions/89488/comparing-stdtr1function-objects), quindi –
@mmutz: They ' chiudo, ma non ho intenzione di chiamare il dupe. Le librerie TR1 possono avere una specifica diversa per le librerie C++ 0x. – Puppy