Funciones-miembro (métodos) genéricos en clases genéricas
Ejemplo
Definición de un método genérico en una clase genérica. La definición se realiza on-line (en el interior de la clase-plantilla).
#include <iostream>
using namespace std;
template<class X> class A { // clase genérica
public:
int x;
X* xptr;
template<class T> void fun(T t1, T t2) { // método genérico
cout << "Valor-1: " << t1
<< ", Valor-2: " << t2
<< ", Miembro-x: " << x
<< ", Objeto: " << *xptr << endl;
}
A (X* b, int i = 0) { // constructor
x = i;
xptr = b;
}
};
int main(void) { // ==============
char c = 'c'; char* cptr = &c;
int x = 13; int* iptr = &x;
A<int> a(iptr, 2); // instanciar un objeto
A<char> b(cptr, 3); // ídem.
a.fun(2, 3); // M.5: invocar método de instancia
a.fun('x', 'y'); // M.6: ídem.
b.fun(2, 3); // M.7: ídem.
b.fun('x', 'y'); // M.8: ídem.
return 0;
}
Salida
Valor-1: 2, Valor-2: 3, Miembro-x: 2, Objeto: 13
Valor-1: x, Valor-2: y, Miembro-x: 2, Objeto: 13
Valor-1: 2, Valor-2: 3, Miembro-x: 3, Objeto: c
Valor-1: x, Valor-2: y, Miembro-x: 3, Objeto: c
Comentario
Observe que la definición del método fun es exactamente análoga a la de una función genérica cualquiera, así como sus invocaciones (sentencias M.5 a M.8).
Puede comprobarse como en cada caso, el método opera sobre el objeto a o b, adecuado, además de disponer de una versión (especialidad) del método fun adecuada para cada situación: una versión fun(int, int) y otra versión fun(char, char).
Observe que en tiempo de ejecución existen dos funciones-clase: A para int, y A para char (representadas respectivamente por A<int> y A<char>). Cada una de estas dos funciones-clase dispone de dos métodos: fun(int, int) y fun(char, char).
El compilador no realiza instanciaciones innecesarias de clases o funciones genéricas, de forma que, por ejemplo, si se omitiese la sentencia M.8, la función-clase A<char> no dispondría de la versión fun(char, char).