Piccolo Cheat Sheet per il C++ parte 5

Quinta parte del Cheat Sheet per C++

  • funzioni template

template <class tipo1, class tipo2,...>

tipo_restituito func(parametri)

{

... // posso usare "tipo1,2" quando devo dichiarare una variabile di tipo parametrico (anche nella lista dei parametri o nel tipo restituito)

}

se ho una funzione template ed una con overloading espicito, quest’ultima ha la precedenza nel caso di invocazione con i tipi per i quali c’è l’overloading.

  • classi template

template <class tipo1, class tipo2,...>

class nomeClasse {

...

}

// per dichiarare un oggetto

nomeClasse<tipo1, tipo2,...> oggetto;

è possibile definire degli argomenti standard nel template

template <class tipo1=int>...

è anche possibile dichiarare degli argomenti non tipi:

template <class tipo1, int size>

... // uso size come una normale variabile

nomeClasse<double, 10> oggetto; //tutte le ricorrenze di size nella classe verranno sostituite con 10

è possibile specificare esplicitamente una classe template:

template <class tipo1, class tipo2,...>

class nomeClasse {

...

}

...

template <>

class nomeClasse<int, double,...> {

...

}

  • typename e export

typename può sostituire class all’interno del template <class tipo> == <typename tipo>

typename assicura che un nome utilizzato in un template si riferisca ad un tipo e non ad un nome di un oggetto (vedi sopra l’esempio con size)

export precede la dichiarazione di un template e consente agli altri file di usare il template senza dover duplicare tutta la definizione, ma indicando solo la dichiarazione.

  • Gestione eccezioni

try {

...

throw valore_tipo_eccezione //es: throw 100

} catch(tipo eccezione_var) { //es: int i

...

}

il tipo di una eccezione può essere sia un tipo base, sia un tipo definito dall’utente (una classe)

non serve il new nella clausola throw

un catch con un tipo base cattura anche eccezioni di tipo derivato

catch(...) // cattura eccezioni di qualsiasi tipo

tipo func(par) throw(tipo1, tipo2, tipo3) // questa funzione può lanciare solo eccezioni di tipo1, tipo2 o tipo3

{

...

}

tipo func(par) throw() // questa funzione non può lanciare eccezioni

{

...

}

se voglio propagare un’eccezione catturata in un catch verso l’esterno:

catch(tipo eccezione) {

...

throw; // rilancia un'eccezione pari a *eccezione*

}

  • terminate() e unexpected()

serve l’header <exception>

terminate() viene richiamata quando nel programma non è presente un catch() in grado di catturare l’eccezione lanciata (normalmente richiama abort())

unexpected() viene lanciata quando una funzione tenta di lanciare non consentita a causa del costrutto throw(tipo1, tipo2, tipo3). Normalmente richiama terminate()

è possibile associare delle nuove funzioni a queste due funzioni attraverso i seguenti metodi:

terminate_handler set_terminate(terminate_handler newhandler) throw(); // typedef void (*terminate_handler)();

unexpected_handler set_unexpected(unexpected_handler newhandler) throw(); // typedef void (*unexpected_handler)();

  • uncaught_exception()

bool uncaught_exception();

restituisce true se è stata lanciata un’eccezione non ancora catturata

  • classe exception e bad_exception

la libreria standard dichiara la classe base exception, il gestore di unexpected() può lanciare un’eccezione di tipo bad_exception

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...