C++ Plantillas de funciones


Ejemplo

Las plantillas también se pueden aplicar a las funciones (así como a las estructuras más tradicionales) con el mismo efecto.

// 'T' stands for the unknown type
// Both of our arguments will be of the same type.
template<typename T>
void printSum(T add1, T add2)
{
    std::cout << (add1 + add2) << std::endl;
}

Esto puede ser usado de la misma manera que las plantillas de estructura.

printSum<int>(4, 5);
printSum<float>(4.5f, 8.9f);

En ambos casos, el argumento de la plantilla se utiliza para reemplazar los tipos de parámetros; el resultado funciona igual que una función normal de C ++ (si los parámetros no coinciden con el tipo de plantilla, el compilador aplica las conversiones estándar).

Una propiedad adicional de las funciones de plantilla (a diferencia de las clases de plantilla) es que el compilador puede inferir los parámetros de la plantilla en función de los parámetros pasados ​​a la función.

printSum(4, 5);     // Both parameters are int.
                    // This allows the compiler deduce that the type
                    // T is also int.

printSum(5.0, 4);   // In this case the parameters are two different types.
                    // The compiler is unable to deduce the type of T
                    // because there are contradictions. As a result
                    // this is a compile time error.

Esta característica nos permite simplificar el código cuando combinamos estructuras de plantillas y funciones. Hay un patrón común en la biblioteca estándar que nos permite crear una template structure X mediante la función auxiliar make_X() .

// The make_X pattern looks like this.
// 1) A template structure with 1 or more template types.
template<typename T1, typename T2>
struct MyPair
{
    T1      first;
    T2      second;
};
// 2) A make function that has a parameter type for
//    each template parameter in the template structure.
template<typename T1, typename T2>
MyPair<T1, T2> make_MyPair(T1 t1, T2 t2)
{
    return MyPair<T1, T2>{t1, t2};
}

¿Cómo ayuda esto?

auto val1 = MyPair<int, float>{5, 8.7};     // Create object explicitly defining the types
auto val2 = make_MyPair(5, 8.7);            // Create object using the types of the paramters.
                                            // In this code both val1 and val2 are the same
                                            // type.

Nota: Esto no está diseñado para acortar el código. Esto está diseñado para hacer que el código sea más robusto. Permite cambiar los tipos cambiando el código en un solo lugar en lugar de en varias ubicaciones.