Motivación

Implementar una clase que nos permita asociar dos valores no necesariamente del mismo tipo ni de tipos conocidos de antemano.

Dominio de variables

Necesitaremos una variable especial para poder generalizar cualquier tipo. A éstas las denominamos variables de tipo y su dominio es el siguiente:

$$ \text{Dom} (T) = \{\text{Tipos C++}\} \cup \{\text{Tipos Usuario}\} $$

Templates

C++ implementa las variables de tipo a través de templates.

#ifndef TUPLA_HPP
#define TUPLA_HPP

template<class T1, class T2>
Class Tupla {
	public:
		Tupla(T1 t1, T2 t2);
		T1 t1() const;
		T2 t2() const;
		bool operator==(Tupla t) const;
	private:
		T1 _t1;
		T2 _t2;
};

template<class T1, class T2>
// Para esto los tipos T1 y T2 deben tener definido el operador ==
bool Tupla<T1, T2>::operator==(Tupla t) const {
	return _t1==t.t1() && _t2==t.t2()
}

template<class T1, class T2>
Tupla<T1, T2>:: Tupla(T1 t1, T2 t2) : _t1(t1), _t2(t2) {}

template<class T1, class T2>
T1 Tupla<T1, T2>::t1() const{
	return _t1;
}

template<class T1, class T2>
T2 Tupla<T1, T2>::t2() const{
	return _t2;
}

#endif

Convención

.h: headers

.cpp: implementaciones

.hpp: templates (todo)