std::function e La Linea di Comando (main)
Abbiamo visto tante entità invocabili (Callable Objects): Funzioni classiche globali, Puntatori a funzione, Funtori custom (classi con operator()), e le bellissime Lambda.
Cosa succede se, per un progetto enorme o per un array eterogeneo, volessimo salvarle e mischiarle tutte in un’unica variabile universale? I puntatori a funzione C-Style fallirebbero miseramente con le Lambda contenenti Capture List o con i Funtori.
La soluzione si chiama std::function (dalla libreria <functional>).
Il Contenitore Universale std::function
Section titled “Il Contenitore Universale std::function”La std::function è un wrapper polimorfico: agisce da puntatore universale C++.
Sintassi: std::function<TipoRitorno(TipoArg1, TipoArg2)>
Costo prestativo: L’incapsulamento dinamico polimorfico in una
std::functionnon è gratis. Richiede de-referenziazioni di puntatori interni e può distruggere in toto le capacità d’Inlining. Usalo se devi davvero “spostare” dinamicamente gli oggetti o infilarli in collezioni eterogenee; nei Template Function in alta intensità computazionale, usa direttamente i classici<typename Fn>.
La Funzione ‘main’ e Command Line
Section titled “La Funzione ‘main’ e Command Line”Tutti i programmi C++ richiedono l’esatto e univoco entry point di avvio: la funzione globale main.
Non supporta template né modificatori speciali. Esistono tre “Overload” autorizzati.
- L’ignorante:
int main(); - Lo standard:
int main(int argc, char* argv[]); - Il vendor-specifico (obsoleto):
int main(int argc, char* argv[], parametri_implementazione...);
L’ambiente e il sistema operativo passano all’eseguibile, dal momento del suo avvio nel Terminale, i parametri di linea di comando.
argc(Argument Count): Il numero di parametri passati (almeno 1).argv(Argument Vector): Un array di puntatori a stringhechar*. Il primo elemento (ovveroargv[0]) è obbligatoriamente il percorso assoluto o il nome dell’eseguibile stesso chiamato dal terminale! I successivi sono i flag inseriti dall’utente separati da spazio (myapp.exe --aiuto ciao). In un Terminale Linux/Windows, raggruppare i parametri tra apici doppi (“il mio test”) istruisce l’OS a non splittarli per spazio.
Rigorosamente, la funzione main ritorna un int. Se non inserito manualmente, il compilatore C++ moderno appiccicherà in silenzio un return 0; (0 corrisponde univocamente al codice globale “Tutto ok, esecuzione pulita terminata”).
Codici superiori indicano tipicamente che l’app è fallita (o in pipeline, un codice errore).