STL utilizza il primo approccio (passaggio per valore)
Certo, le librerie standard passano iteratori e funtori per valore. Si presuppone (giustamente o erroneamente) di essere economici da copiare, e questo significa che se si scrive un iteratore o un functor che è costoso da copiare, potrebbe essere necessario trovare un modo per ottimizzarlo in seguito.
Ma questo è solo per gli scopi per cui le librerie standard utilizzano i funtori - per lo più sono predicati, anche se ci sono anche cose come . Se stai integrando una funzione, questo suggerisce una sorta di librerie di matematica, nel qual caso suppongo che potresti avere molte più probabilità di occuparti di funzioni che portano molto stato. Ad esempio, potresti avere una classe che rappresenta i polinomi dell'ennesimo ordine, con i coefficienti n + 1 come membri di dati non statici.
In tal caso, un riferimento const potrebbe essere migliore. Quando si utilizza un tale functor in algoritmi standard come transform
, è possibile avvolgerlo in una piccola classe che esegue l'indirizzamento indiretto tramite un puntatore, per assicurarsi che rimanga economico da copiare.
Prendere un riferimento non const è potenzialmente fastidioso per gli utenti, poiché impedisce loro di passare in provvisori.
fonte
2011-11-19 19:05:44
STL di solito utilizza il primo approccio perché sorgono molti problemi quando si utilizzano contenitori di riferimenti, ecc. –
Come ovunque: A seconda di cosa 'F', queste versioni possono variare dall'essere identiche a molto diverse. Se 'F' è di stato, solo la versione centrale potrebbe essere possibile. –
Fondamentalmente, stai mettendo i requisiti per i tuoi utenti qualunque sia la forma che scegli. Se per valore, stai richiedendo che ti diano un funtore che può essere copiato senza perdita di integrità. Se per riferimento, devi richiedere che ti diano qualcosa con una durata adatta a qualsiasi utente tu stia mettendo. – Mordachai