Si lo haces para practicar templates me parece una práctica con bastante profundidad... ahora, a efectos prácticos creo que es mejor tener una clase para encapsular ese "union" por varias razones:
- No hay mucha diferencia a efectos de consumo de memoria entre declarar 20 tipos en un union o declarar únicamente 3
- Si intentas usar tipos no básicos "strings, clases propias" vas a tener que especializar el template, complicando el mantenimiento del código
- Un template al estilo "tuple", si bien puede ser muy útil en determinadas ocasiones, impone mucha rigidez al código. No puedes hacer un get iterativo de un "tuple" porque el "index" del get tiene que estar especificado en tiempo de compilación.
- Tienes que estar siempre pendiente del tipo de dato almacenado en cada posición del "union" para evitar conversiones no deseadas.
Si revisas el código fuente de "tuple" verás un poco la estructura que tiene que montar para funcionar... no es moco de pavo. En el caso de mi compilador, la implementación hace uso de media docena de archivos, con uso de macros y todo...
Un problema fundamental de este tipo de diseños es que la programación de templates en C++ acaba degenerando con gran facilidad en un código oscuro en el que la única persona capacitada para editar el código es el propio creador... y eso si aún se sigue acordando del diseño.