Premesso che si può fare tranquillamente anche senza, occorre un cast ( un dynamic_cast ) per la precisione. Meglio se definisci un pò meglio quel che ti serve.
Con i template la cosa più semplice è fornire la specializzazione del template stesso, lasciando al compilatore la scelta della funzione specializzata più adatta (che ovviamente andrà implementata).
Es.
codice:
// generico
template <typename T> void insert<T>(Nodo* n);
// specializzato per Element
template <> void insert<Element>(Nodo* n) {
Element* el = dynamic_cast<Element*>(n);
if (el) {
// operazioni varie proprie di Element.
}
}
// specializzato per Attribute
template <> void insert<Attribute>(Nodo* n) {
Attribute* attr = dynamic_cast<Attribute*>(n);
if (attr) {
// operazioni varie proprie di Element.
}
}
...
insert<Element>(node);
insert<Attribute>(node);