Implementar una clase que nos permita asociar dos valores no necesariamente del mismo tipo ni de tipos conocidos de antemano.
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}\} $$
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
T1
y T2
toman un valor concreto en tiempo de compilación.Tupla
para cada combinación de tipos que estemos instanciando..h
: headers
.cpp
: implementaciones
.hpp
: templates (todo)