﻿
#include <iostream>
using namespace std;

// szablon funkcji dodaj()
template <typename T>
T dodaj(T a, T b) {
    return a + b;
}

// specjalizacja szablonu funkcji dodaj() dla typu int
template<>
int dodaj(int a, int b) {
    cout << "suma liczb " << a << " oraz " << b << " wynosi ";
    return a + b;
}

int main()
{
    // przy wywołaniu funkcji szablonowej kompilator w pierwszej kolejności szuka 
    // specjalizacji szablonu dla podanego typu, 
    // gdy jej nie znajdzie konkretyzuje szablon dla tego typu  
    
    // wywołania funkcji szablonowej dodaj()
    // przy niejawnym określeniu parametru szablonu
    cout << dodaj(2,4) << endl; // w tym wywołaniu funkcji szablonowej dodaj() 
                                // kompilator wybiera wersję specjalizowaną szablonu
                                // (argumentami funkcji dodaj są typy int)
    cout << dodaj(2.0, 4.0) << endl;
    string a = "maly ";
    string b = "kotek";
    cout << dodaj(a, b) << endl;
    // wywołanie funkcji szablonowej dodaj()
    // przy jawnym określeniu parametru szablonu (char)
    cout << dodaj<char>('2','4') << endl;
    
}



