Disponible la nueva versión "donationware" 7.3 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).