Функции шаблони


Понякога се налага да се пишат две или повече функции, които се различават само по типа на данните на техния параметър. Такъв е случаят например с функцията min. 
int min( int a, int b ) {

   if(a < b) return a;

        else return b;

}

 double min( double a, double b ) {

   if (a < b) return a;

        else return b;
}

 

Ако заместим с Т типа данни, използвани във всяка от функциите min, то получаваме някакъв нов вид функция, в която типът данни е неопределен и може да се приеме като параметър.

Езикът С++ допуска дефиниране на подобни функции и те са известни с името функции шаблони. При дефинирането си всяка функция шаблон трябва да се предшества от специална синтактична конструкция от вида:

template  < typename име1, …, typename имеn >

В която template  и typename са ключови думи от езика, а име1, …, имеn са имена(идентификатори) на типове данни – параметри на функцията. Вместо ключовата дума typename може да се използва думата class. В случая и двете ключови думи имат един и същ смисъл. Поради това, че думата classсе използва при деклариране на класове, то тук при функциите шаблони ще използваме думата typename.

Пример 1:

template <typename T>

   T min( T a, T b )

{

   if(a < b) return a;

        else return b;

}

int main() {

   cout<<min( 10, 20 );

   cout<< min( 10.0, 20.0 );

   cout<< min( ‘k’, ‘m’ );


   return 0;
}

 

Пример 2: (вектори)

#include <iostream>

#include <vector>

using namespace std;

template <typename T>

void readv(vector <T> &v,int n)

{

    T a;

    for ( int i = 0 ; i <n ; i++ )

    {

        cin>>a;

        v.push_back(a);

    }

}

template <typename T>

void writev(vector <T> v)

{

    for ( int i = 0 ; i <v.size() ; i++ )cout<<v[i]<<" ";

    cout<<endl;

}

int main()

{

    vector <int>  v1;

    cout<<"Vavedete broq na elementite na vektor1: ";

    int n;

    cin>>n;

    readv(v1,n);

    writev(v1);

    vector <double>  v2;

    cout<<"Vavedete broq na elementite na  vektor2: ";

    cin>>n;

    readv(v2,n);

    writev(v2);

 

    return 0;

}

В момента разглеждате олекотената мобилна версия на уебсайта. Към пълната версия.