Come si lavora in un ambiente integrato, si favorirebbe probabilmente soluzioni estremamente minimale e si può usufruire di non standard o non-portatili fatti circa il compilatore.
Se una classe è polimorfica (ha almeno una propria funzione virtuale) in C++, probabilmente ha un puntatore a un vtable incorporato da qualche parte in esso. Può darsi che il puntatore vtable appaia all'inizio del layout dell'oggetto in memoria.
Questo è vero per molti compilatori, quelli che utilizzano il C++ ABI - a related SO question here.
Se è così, si potrebbe essere in grado di arrivare alla vtable in questo modo:
void *get_vtable(void *obj)
{
return *(reinterpret_cast<void **>(obj));
}
Quindi è possibile confrontare i VTables di due puntatori-a-oggetti per vedere se puntano allo stesso tipo di oggetto.
Quindi un "tipo di switch" (che è ciò che cattura fondamentalmente) avrebbe fatto qualcosa di simile:
P p;
Q q;
if (get_vtable(caught) == get_vtable(&p))
{
// it's a P...
}
else if (get_vtable(caught) == get_vtable(&q))
{
// it's a Q...
}
Si potrebbe nascondere quel modello in una macro CATCH.
Punto importante - se si deriva una classe da una base, ma la classe derivata non ridefinisce le funzioni virtuali o aggiungere nuovi funzioni virtuali, allora il compilatore, concettualmente, potrebbe riutilizzare vtable della classe base per la classe derivata. Ciò significa che, al fine di distinguere tra due tipi di eccezione, ognuno deve ignorare una funzione virtuale, per garantire che abbiano i propri vtables.
notare che questa è solo una piccola frazione di quello che comporta la gestione delle eccezioni. C'è anche la piccola questione di srotolare lo stack! Devi chiamare i distruttori di tutti gli oggetti in pila quando salti sul gestore. Non si tratta solo di fare setjmp/longjmp.
fonte
2009-07-03 22:06:56
Stai scrivendo/modificando il compilatore o il runtime della lingua, o dove esattamente vuoi inserire questo? Un po 'più di contesto sarebbe bello. – jalf
Se la memoria è limitata, non abilitare RTTI o tentare di utilizzare eccezioni.Meglio pensare a un approccio alternativo. –
Se è stata lanciata un'eccezione, in qualche modo il tiro ha codificato le informazioni sul tipo di eccezione, quindi non vedo perché è necessario un metodo "alternativo". Come disse Jalf, dacci maggiori informazioni su ciò che stai effettivamente cercando di fare. –