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.
fonte
2012-07-27 03:02:39
'std :: not1' e' std :: not2' si aspettano ancora quei typedef "adattabili". – Cubbi
@Cubbi: Sono le uniche parti di C++ 11 che ancora fanno? – Scotty
@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