C++ Modelli di funzione


Esempio

I modelli possono anche essere applicati alle funzioni (così come le strutture più tradizionali) con lo stesso effetto.

// '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;
}

Questo può quindi essere usato allo stesso modo dei modelli di struttura.

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

In entrambi i casi l'argomento template viene utilizzato per sostituire i tipi dei parametri; il risultato funziona proprio come una normale funzione C ++ (se i parametri non corrispondono al tipo di template il compilatore applica le conversioni standard).

Un'ulteriore proprietà delle funzioni del modello (a differenza delle classi template) è che il compilatore può dedurre i parametri del modello in base ai parametri passati alla funzione.

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.

Questa funzione ci consente di semplificare il codice quando combiniamo strutture e funzioni del modello. C'è un modello comune nella libreria standard che ci consente di creare una template structure X usando una funzione helper 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};
}

In che modo questo aiuta?

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: questo non è progettato per abbreviare il codice. Questo è progettato per rendere il codice più robusto. Consente di modificare i tipi modificando il codice in un singolo posto piuttosto che in più posizioni.