Los Templates en C++

C++ | 7 comentarios

Este artículo es una continuación de Programación Genérica.

Siguiendo con la introducción que hizo Eduardo y con ayuda de unos amigos, voy a explicar que son y para que se usan los templates, uno de los recursos mas poderosos de C++.

Definición

Según la wikipedia:

Las plantillas son el mecanismo de C++ para implantar el paradigma de la programación genérica. Permiten que una clase o función trabaje con tipos de datos abstractos, especificándose más adelante cuales son los que se quieren usar.

Las templates nos permiten crear estructuras de datos que no dependen de si vamos a ingresarles un entero, una letra, o cualquier otro tipo de dato que se nos ocurra. ¿como es esto? Se nos permite, mediante simples modificaciones, adaptar nuestras estructuras.

Yo usaré una clase con un array (vector) que iré modificando para que reciba enteros, luego char y por ultimo float(reales). Esta es una de las mejores maneras de reutilizar código!

A la antigua, esto requería que se hiciera 3 clases diferentes con 3 arrays diferentes... pero usando templates lo haré en una sola.

El siguiente es el código:

/*********ARCHIVO PRUEBA.H ***********/
#ifndef PRUEBA_H_
#define PRUEBA_H_
#include <iostream>

/**
 * Aqui empiezan las diferencias a una declaración ordinaria.
 * La linea siguiente define que cada vez que aparezca  "t"
 * se modificará el dato por otro que mas adelante definiremos.
 */

template <class t>

class prueba
{
  private:

                      /** como vemos, el array no es ni de enteros **/
    t array[5];       /** ni de char ni de otros datos sino que es
                      /** de datos tipo "t"
                      /**/

    int poscicion;

  public:
    prueba(){}
    virtual ~prueba(){}
    bool ingresar_datos(t & datos)
    {
      if (poscicion<5)
      {
        array[poscicion]=datos;
        poscicion ++;
        return true;
      }
      else
      {
        return false;
      }
    }

    /**
     * nuevamente vemos que esta funcion nos devuelve un dato de tipo "t"
     */

    t mostrar_datos(int & pos)   
    {
      if (pos<=4 && pos>=0)
        return array[pos]
      else
        return array[1];    
    }
};

#endif /*PRUEBA_H_*/

Bueno, hasta aquí vimos que donde supuestamente debía aparecer un tipo de dato aparecía una "t", esto le indicará al compilador que se debe tomar a "t" como el tipo de variable que a continuacion definiremos en el main de abajo.

Jugando con templates

A continuación, dejo una posible implementación en un archivo main.cpp:

#include "prueba.h"
#include <iostream>

using namespace std;

int main (){
  int   dato1 = 1;
  char  dato2 = 'a';
  float dato3 = 3.14;
  int   pos = 0;

  prueba<float>prueba3;
  prueba<char>prueba2;
  prueba<int>prueba1;

  prueba1.ingresar_datos(dato1);
  cout <<prueba1.mostrar_datos(pos) <<endl;

  prueba2.ingresar_datos(dato2);
  cout <<prueba2.mostrar_datos(pos) <<endl;

  prueba3.ingresar_datos(dato3);
  cout <<prueba3.mostrar_datos(pos) <<endl;
  return 0;
}

Como vemos, con esta simple declaración cambiamos de una clase común, a una clase que puede admitir tanto enteros como punteros como cualquier otro dato que se nos ocurra; hicimos una infinidad de pasos en pocas líneas ya que con modificar <float> por <char> o por <int> cambiamos nuestra clase para que admita un dato diferente.

Ahora, quizás esta forma de definir nuestras clases y crear objetos se vea un poco complicada, pero yo recomiendo que se familiaricen bien con los templates porque en mas de una ocasión nos ahorrarán muchas pero muchas líneas de código.

Mas adelante explicaré como crear una lista enlazada con templates... y ahí veremos la gran utilidad de los templates.

¿Y tu, utilizas esta potente herramienta?

Posteado por Gustavo