So che questa domanda è stata posta prima, ma nonostante sia un programmatore esperto non capisco le risposte e non vedo modo di rispondere a queste domande precedenti per chiedere una precisazione. Non esiste un collegamento "risposta" o altro. Inoltre, quelle domande erano piuttosto vecchie. Quindi, sto facendo di nuovo la domanda.Come sovraccaricare su std: firma di funzione in C++
Ho una classe, in cui sovraccarico l'operatore + =. Voglio un sovraccarico di prendere un puntatore a funzione nuda, e l'altro di prendere una std :: funzione:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
Usage:
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
Purtroppo, il codice non viene compilato perché il compilatore non è in grado di determinare che il secondo sovraccarico non è adatto per la prima + = chiamata.
Come definire il mio operatore + = funzioni membro per correggere questo problema? Non voglio cambiare il modo in cui vengono utilizzati gli operatori (ad esempio utilizzando un cast esplicito). Voglio che funzionino come dimostrato sopra.
Inoltre, sarebbe utile avere il seguente overload così:
void operator+=(function<void()> handler);
Ma ancora una volta, non può sovraccaricare in base alla firma della funzione <> modello.
Vedere questo thread per ulteriori esempi: Isn't the template argument (the signature) of std::function part of its type? (ho provato attuazione delle diverse soluzioni menzionate in quel filo, e nessuno di essi compilazione)
Sono stato di programmazione per molti anni in numerosi lingue, ma le mie competenze in C++ sono un po 'arrugginite.
la domanda ** big ** è: __Che hai intenzione di fare con un puntatore a funzione dato o un oggetto 'std :: function' nel tuo overload' operatore + = '? __ – zaufi
@zaufi: Non riesco a vedere come è rilevante, ma va bene. Lo aggiungerò a un std :: vector delle funzioni del gestore di eventi. Sto essenzialmente implementando eventi .NET in C++. Perché i Poteri che Sono non hanno ancora bloccato la testa sul fatto che Eventi e Proprietà sono - come le Chiusure - funzionalità assolutamente essenziali per un linguaggio di programmazione moderno. –
quindi, devi avere un 'std :: vector' istanziato con' std :: function' con uno esacly (suggerisco 'void()') signature ... Ho ragione? – zaufi