A Coder’s Corner

Blog de tecnologia y programación

Templates de C++ – Specializations

Posted by gfaraj on May 10, 2007

Hoy les hablaré un poco más de los templates de C++. Las especializaciones o specializations permiten que el programador defina un template diferentemente para un tipo especifico. Por ejemplo, una funcion que retorna verdadero si el parametro es un int o falso si no lo es:

template <typename T>
bool es_int()
{
    return false;
}

template <>
bool es_int<int>()
{
    return true;
}

int main()
{
    std::cout << es_int<int>() << std::endl;
    std::cout << es_int<bool>() << std::endl;
}

El primer template es el que se le llama el base template y el segundo es una especialización del mismo. Si corren el programa van a ver que imprime 1 en la primera linea y 0 en la segunda. Es un concepto muy util que nos permite hacer cosas bien interesantes. Tambien se puede aplicar a templates de clases.

template <typename T>
class MiClase
{
};

template <>
class MiClase<int>
{
private:
    MiClase();  // constructor privado
};

int main()
{
    MiClase<bool> c1;  // todo bien
    MiClase<int> c2;   // error: el constructor es privado!
}

Este ejemplo muestra como se puede prevenir que se use un template si se quiere usar con algun tipo especifo. Al igual que las funciones, el primero se llama el base template y el segundo es una especialización. Al declarar el constructor de MiClase<int> como privado, el compilador no te deja crear una instancia de el.

Basicamente asi es como se especializa una funcion o una clase template. Talvez no le vieron la gran utilidad con estos ejemplos, pero se usa extensivamente en Boost para crear cosas muy utiles. Otro dia vendré con aplicaciones más interesantes de este concepto.🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: