Spiega meglio cosa vuoi fare... in linea di massima dovresti tenere template la parte comune, e richiamare una sotto-funzione template con le specializzazioni parziali.
---EDIT---
Anche perché con degli if abbinati a typeid tutto il codice verrebbe comunque compilato, per cui se delle parti di codice non si possono applicare agli altri tipi comunque devono essere con essi sintatticamente compatibili.