2012-09-21 14 views
7

Le funzioni membro hanno un parametro puntatore this implicito. Perché std::function accetta questa firma, quindi, dove S è una classe semplice? (complete sample)Perché la funzione std :: accetta un riferimento nella firma?

std::function<void(S &)> func = &S::foo; 

Calling funziona, troppo, e distingue gli oggetti:

S s1 = {5}; 
S s2 = {6}; 

func(s1); //prints 5 
func(s2); //prints 6 

Quello che mi piacerebbe normalmente si aspetta è che ha bisogno di un puntatore, che funziona così: (complete sample)

Perché il primo funziona quando si passa un riferimento nella funzione membro quando il parametro implicito this è un puntatore?

risposta

3

std::function<SIG> può essere costruito da molte cose che si comportano come funzioni, convertendole in un oggetto appropriato std::function.

In questo caso void S::foo() si comporta come una funzione void foo_x(S&) (come in entrambi richiedono un S chiamare, e potenzialmente modificare S, rinviare nulla). Di conseguenza, std::function<void(S&)> fornisce un costruttore per la conversione della funzione membro in un oggetto funzione. Cioè

std::function<void(S &)> func = &S::foo; 

utilizza un costruttore, qualcosa come std::function<void(S&)>(void(S::)()), per creare qualcosa di equivalente a:

void foo_x(S & s) { return s.foo(); } 
std::function<void(S&)> func = foo_x; 

Allo stesso modo,

std::function<void(S * const)> func = &S::foo; 

è equivalente a

void foo_x(S * const s) { return s->foo(); } 
std::function<void(S* const)> func = foo_x; 

attraverso un costruttore come std::function<void(S* const)>(void(S::)()).

+2

Questa è stata una lettura molto istruttiva, grazie. Ha molto più senso quando si considera che 'std :: function' è indipendente dai puntatori di funzioni raw e ha il potere di fare ciò che gli piace per aumentare l'usabilità della cosa che sta avvolgendo. – chris

5

Perché std::function è stato progettato correttamente. Il fatto che this sia un puntatore è un incidente di cronologia e un dettaglio interno alla funzione membro. Il fatto non dovrebbe avere alcun impatto sulle decisioni di progettazione degli utenti della funzione.

I progettisti di std::function hanno deciso, giustamente, di accettare le funzioni membro quando il primo parametro digita nella firma è un riferimento.

Problemi correlati