No creo que se pueda hacer de esa manera. La idea de un template es que el compilador escriba el código de las clases y funciones template que necesita, ahorrándonos tener que escribirlas a mano, pero las reglas del juego siguen siendo las mismas. Por ejemplo, si has declarado que una función devuelve un cierto tipo de dato, no se puede cambiar eso en tiempo de ejecución. Con la idea de polimorfismo se puede decidir qué función o qué tipo de objeto (dentro de una familia) va a invocarse o crearse, pero esa función o tipo de objeto tienes que estar definidas desde antes.
Por otro lado, typeid devuelve un objeto que puede compararse con otro typeid, pero no hay ninguna garantía que dos llamadas consecutivas vayan a devolver la misma representación de ese objeto, y mucho menos que name() vaya a devolver lo que estás esperando. El estándar C++ sólo exige que los objetos devueltos sean comparables y que su comparación devuelva true o false, nada más; cualquier otra suposición será cierta o no dependiendo del compilador que se use. Así que ese mecanismo de comparar lo que devuelve name() mejor olvidarlo, a no ser que tengas garantías de que jamás se va a compilar con otro compilador y que jamás vaya a cambiarse de versión... bueno, olvídalo.
Pero bueno, entiendo que de todos modos estaría muy bien tener una respuesta (tu objeto Matrix suma de dos Matrixes) del tipo más comprensivo (estaba por poner "abarcativo", ¡dioses!), evitando que algún valor se trunquen eventualmente.
A ver qué te parece...
Si puedes compilar con C++11, se me ocurre un sucio hack echando mano de "auto" y de "decltype". auto es el tipo de una variable que el compilador deduce del entorno, y decltype devuelve el tipo de la variable de su argumento.
1) Entonces, se podría dejar que el compilador resuelva las promociones entre los tipos de datos, como lo hace siempre, por ejemplo:
short + int = int, etcétera.
2)
Código C++:
Ver originalauto type = (data_1) 1 + (data_2) 2;
si data_1 fuera un int y data_2 un double, "auto" sería un doble.
3)
Código C++:
Ver originaldecltype(type) c[a][b]={{0,0},{2,7},{0,0},{4,9},{0,0}};
estaría declarando tu matriz de tipo double, siguiendo el ejemplo.
4) y de la misma manera, poniendo decltype(type) en donde necesites definir el tipo, por ejemplo también en
Así tendrías las promociones definidas al crear los objetos de tipo Matrix, y las sumas de sus elementos también ya serían del mismo tipo.
Lareto :)