Come esempio di quanto possiamo fare con isOf() e come cast() può rendere più sicuro il codice, consideriamo le modifiche seguenti in relazione al programma di test.
#include "Circle.h" #include "List.h" int main (int argc, char ** argv) { void * q; unsigned n; initList(); initCircle(); q = new(List, 1); while (* ++ argv) switch (** argv) { case ’+’: switch ((* argv)[1]) { case ’c’: addFirst(q, new(Circle, 1, 2, 3)); break; case ’p’: addFirst(q, new(Point, 4, 5)); break; default: addFirst(q, new(Object)); } break; case ’—’: puto(takeLast(q), stdout); break; case ’.’: n = count(q); while (n —— > 0) { const void * p = takeFirst(q); if (isOf(p, Point)) draw(p); else puto(p, stdout); addLast(q, p); } break; default: if (isdigit(** argv)) addFirst(q, (void *) atoi(* argv)); else addFirst(q, * argv + 1); } return 0; }
Per argomenti che iniziano con + il programma aggiunge cerchi, punti e altri oggetti ad una lista. L'argomento – rimuove l'ultimo oggetto e lo mostra con puto(). L'argomento . mostra il contenuto corrente della lista, draw() viene usato se una entry è derivata da Point. Infine, vi è un deliberato tentativo di inserire numeri o altre stringhe come argumenti nella lista sebbene essi possano causare problemi quando vengono rimossi. Ecco un esempio di un possibile output:
$ list +c +p + — . 1234 Circle at 0x122f4 Object at 0x12004 "." at 4,5 Object.c:66: failed assertion `sig == 0’
Come vedremo nella sezione 8.4, addFirst() usa cast() per assicurarsi che vengano aggiunti solamente oggetti alla lista. Cast() può essere inoltre resa più robusta e quindi avere la capacità di scoprire se una stringa o un numero vengono passati come oggetti.