Sie sind auf Seite 1von 16

Programacin Orientada a Objetos con C++

Plantillas (templates)

Motivacin

Muchas veces tuvimos que repetir cdigo como:


int promedio(int num1, int num2, int num3) { return (int)((num1+num2+num3)/3); }

float promedio(float num1, float num2, float num3) { return (float)((num1+num2+num3)/3); }

double promedio(double num1, double num2, double num3) { return (double)((num1+num2+num3)/3); }

Motivacin

No sera mejor que pudiramos escribir algo ms genrico como:


?? promedio(?? num1, ?? num2, ?? num3) {return (??)((num1+num2+num3)/3); }

... y que el compilador se encargue de poner los tipos adecuados...

Paradigmas de programacin

Programacin orientada a los datos Algoritmos + estructuras de datos Programacin orientada a objetos

Programacin genrica

Motivacin

Cmo crear una funcin ordenar sin preocuparnos


tanto por qu tipo de datos sean?

Cmo podemos lograr concentrarnos ms en los algoritmos?

En la programacin orientada a los datos

Definimos un tipo de dato que permita representar objetos con ciertas caractersticas comunes. Definamos tambin qu operaciones pueden aplicarse a este tipo y sus reglas de uso.

En la programacin genrica

Construimos algoritmos genricos que permiten representar acciones con ciertas caractersticas comunes. Definimos tambin a que tipos de datos puede aplicarse este algoritmo y sus reglas de uso.

Plantillas o tipos parametrizados

Son un mecanismo C++ que permite que un tipo pueda ser utilizado como parmetro en la definicin de una clase o una funcin. El mecanismo de plantillas C++ es en realidad un generador automtico de cdigo parametrizado. Las plantillas o templates son programas que generan programas (meta-programacin) La funcin o clase genrica se define en tiempo de compilacin

La palabra clave template

template <class T> void miFuncion(T& ref) {/* declaracin de funcin genrica */};

template <class T> class miClase {/* declaracin de clase genrica */};

Ejemplo: funcin max


template <class T> T max(T a, T b) { return (a > b) ? a : b; };

Invocando a max
int i, j; i=10; j=5; ...

int k = max(i,j);

Invocando a max

UnaClase a, b; ...

UnaClase c = max(a,b);

Uso de funciones genricas (templates de funciones)


class Vector2D { float x, y; public: float getX() {return x;} float getY() {return y;} Vector2D (float a, float b) {x=a; y=b;} bool operator>(Vector2D v) { return ((x*x+y*y) > (v.x*v.x+v.y*v.y))?true: false; } };

Uso de funciones genricas (templates de funciones)


template<class T> T max(T a, T b) { if (a > b) return a else return b; }; int main() { int x=2, y=3; cout << "Mayor: " << max(x, y) << endl; Vector2D v1(2,3), v2(1,5); cout << "Mayor: " << max(v1,v2).ver_X(); cout << ", " << max(v1,v2).ver_Y() << endl; return 0; }

Parmetros de una plantilla

Ejemplos:
template <class A, class B> void func(A, B);
template <class A, int x> void func(A, int);

template <class A, size_t N> void func(A, N);


template <class T> class X {...}; template <class A, class T> void func(A, X<T>);

Plantillas de clases
Ejemplo:
template <class T> class Minimax { public: T min(T a, T b); T max(T a, T b); }; template <class T> T Minimax<T>::min(T a, T b) {return (a<b)?a:b; }; template <class T> T Minimax<T>::max(T a, T b) {return (a>b)? a:b; };

Plantillas de clases

. . . int main() { // con enteros int p,q; cin >>p>>q; Minimax<int> mm1; cout<<El menor es:<< mm1.min(p,q)<<endl; // con flotantes float u,w; cin >>u>>w; Minimax<float> mm2; cout<<El mayor es:<< mm2.max(u,w)<<endl; return 0; }

Das könnte Ihnen auch gefallen