¡Nuevo!  por fin disponible la versión 5 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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