2012-07-27 15 views
25

Qual è la differenza tra std :: mem_fun e std :: mem_fn? Perché la denominazione è così confusa?std :: mem_fun vs std :: mem_fn

Boost's documentation afferma che std :: mem_fn può sostituire std :: mem_fun nella maggior parte dei casi. Quindi in quale situazione useresti ancora std :: mem_fun?

risposta

40

std::mem_fun obsoleto. std::mem_fn può fare tutto ciò che fa e lo fa in modo più conveniente. La relazione tra i due è la stessa della relazione tra std::bind1st/std::bind2nd e C++ 11 std::bind. Entrambi std::mem_fn e std::bind sono stati sviluppati e gestiti dopo std::bind1st e std::mem_fun sono stati convertiti nello standard C++ 98. Ciò significa che dovevamo aspettare fino al C++ 11 per sostituire correttamente le vecchie cose con le alternative superiori.

Ad esempio, std::mem_fun può gestire solo le funzioni membro che accettano uno o nessun argomento. std::mem_fn è variadic e può gestire i membri che accettano un numero qualsiasi di argomenti.

È inoltre necessario scegliere tra std::mem_fun e std::mem_fun_ref a seconda se si desidera gestire puntatori o riferimenti per l'oggetto di classe (rispettivamente). std::mem_fn da solo può gestire entrambi, e fornisce anche il supporto per puntatori intelligenti.

La documentazione di boost::mem_fn spiega quando usare std::mem_fun, e mettere semplicemente che è quando avete bisogno di operare con il codice che prevede std::mem_fun, o che si aspetta funtori adattabili (che è un concetto obsoleto * da C++ 03). In questi casi, non è possibile collegare anche lo std::mem_fn, quindi è disponibile: si utilizzerà std::mem_fun per l'eredità.

*: Intendo dire che quel nuovo codice non dovrebbe fare affidamento sul protocollo C++ 03 di avere per es. Tipi di membri result_type (è più consuetudine utilizzare i nuovi tratti come std::result_of): le nuove strutture come std::bind/std::mem_fn forniscono effettivamente tali membri se fossero presenti in equivalente codice C++ 03. Lascio a voi di capire se è necessario aggiornare il vecchio codice che si basa su functable adattabili con std::mem_fn facendo affidamento su questo comportamento.

+2

'std :: not1' e' std :: not2' si aspettano ancora quei typedef "adattabili". – Cubbi

+0

@Cubbi: Sono le uniche parti di C++ 11 che ancora fanno? – Scotty

+1

@Scotty per quanto ho visto, sì, le uniche parti non deprecate. E ci sono 25 modi per creare i funtori con quei typedef, da 'std :: function' e' std :: mem_fn' a 'std :: ref' e' std :: map :: value_comp'. – Cubbi

Problemi correlati