Skip to content

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>).

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::function non è 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>.

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.

  1. L’ignorante: int main();
  2. Lo standard: int main(int argc, char* argv[]);
  3. 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 stringhe char*. Il primo elemento (ovvero argv[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).