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