Șabloane c

Acest termen are și alte semnificații, a se vedea modelul.
Șabloanele (șablonul în limba engleză) reprezintă un instrument pentru C ++. Este destinat pentru codarea algoritmilor generalizați. fără legarea la anumiți parametri (de exemplu, tipuri de date, dimensiuni de buffer, valori implicite).

Apoi pentru primul model scriem: SomeClass <20, int> someVariable; pentru al doilea: SomeClass <30, double> SomeVariable2;

Deși șabloane oferă o bucată rapidă a formei de introducere a codului, de fapt, utilizarea lor nu reduce codul executabil, deoarece fiecare set de parametri, compilatorul creează o instanță separată a funcției sau a clasei. Ca urmare, dispare posibilitatea de a partaja codul compilat în cadrul bibliotecilor partajate.

Șabloane de funcții

Sintaxă descriere șablon

șablon void sort (T array [], int dimensiune); // prototip: modelul modelului declarat, dar nu definit

șablon // intregul parametru char * read ()

Exemplu de utilizare

Cel mai simplu exemplu este definirea a minimum două cantități.

Dacă a este mai mică decât b, atunci returnați a, în caz contrar returnați b

În absența șabloanelor, programatorul trebuie să scrie funcții separate pentru fiecare tip de date utilizat. Deși multe limbaje de programare definesc un built-in functie minime pentru tipurile primitive (cum ar fi numere întregi și numere reale), pot fi necesare această funcție pentru complexe (de exemplu, „timp“ sau „linie“) și foarte complex ( „jucător“ în joc on-line) obiecte .

Deci, modelul funcției de determinare a aspectului minim:

șablon Tmin (T a, T b)

Pentru a apela această funcție, puteți folosi pur și simplu numele acesteia: min (1, 2); min ("a", "b"); min (șir ("abc"), șir ("cde"));

Apelarea unei funcții de șablon

În general, pentru a apela o funcție de șablon, trebuie să specificați valori pentru toți parametrii șablonului. Pentru a face acest lucru, după numele șablonului, este indicată lista valorilor din paranteze unghiulare:

int i [5] = <5, 4, 3, 2, 1>; sort(i, 5);

char c [] = "bwda"; sort(c, strlen (c));

sort(c, 5); // eroare: sortare parametrul int [], nu char []

char * ReadString = citiți<20>(); șterge [] ReadString; ReadString = citire<30>(); Pentru fiecare set de parametri, compilatorul generează o nouă instanță a funcției. Procesul de creare a unei instanțe noi se numește instanțializarea unui șablon.

In exemplul de mai sus, compilatorul a creat un șablon specializare funcție de sortare două (pentru tipurile char și int) și două specializări citesc șablon (pentru BufferSize 20 și 30 de valori). Acesta din urmă este de natură să risipitoare, deoarece pentru fiecare valoare posibilă a parametrului compilatorul va crea mai multe și mai multe exemple de funcții care diferă doar printr-o singură constantă.

Derivarea valorilor parametrilor

În unele cazuri, compilatorul poate deduce (determină logic) valoarea parametrului șablon de funcții din argumentul funcției. De exemplu, atunci când apelați funcția de mai sus sort specifica opțional parametru șablon (dacă acesta coincide cu elementele de tip matrice argument):

int i [5] = <5, 4, 3, 2, 1>; sort (i, 5); // sortați apelurile

char c [] = "bwda"; sortați (c, strlen (c)); // sortați apelurile Este posibil să excludem în cazuri mai complicate.

În cazul folosirii unor șabloane de clasă cu parametri întregi, este posibil să se deducă și acești parametri. De exemplu:

șablon clasa IntegerArray

șablon // Șablonul prototype void PrintArray (IntegerArray array) / / Apelați șablonul

// Utilizând obiectul șablonului IntegerArray<20> IA; PrintArray (ia);

Regulile de inferență sunt introduse în limbă pentru a facilita utilizarea șablonului și pentru a evita posibilele erori, de exemplu, o încercare de a utiliza sortarea pentru a sorta matricea de caractere.

Dacă parametrul șablonului poate fi afișat pe mai multe argumente, atunci ieșirea ar trebui să fie exact aceeași pentru toate aceste argumente. De exemplu, următoarele apeluri sunt greșite:

min (0, 'a'); min (7, 7,0);

Erori în șabloane

Unele erori în descrierea șablonului pot fi identificate deja la locul descrierii. Aceste erori nu depind de parametrii specifici. De exemplu:

șablon void f (date T)

Erori asociate cu utilizarea anumitor parametri de șablon nu pot fi detectate înainte de utilizarea șablonului. De exemplu, șablonul min propriu nu conține erori, ci folosirea acestuia cu tipuri pentru care "<' не определена, приведёт к ошибке:

structura A

A obj1, obj2; min (obj1, obj2);

Dacă introduceți operația "<' до первого использования шаблона, то ошибка будет устранена. Так проявляется гибкость шаблонов в C++.

prieten inline bool operator<( const A& a1, const A& a2 )

min (obj1, obj2);

Șabloane de clasă

Într-o clasă care implementează o listă legată de numere întregi, adăugarea de noi algoritmi pentru elementul din listă, căutați elementul dorit nu depinde de faptul că lista elementelor - numere întregi. Aceleași algoritmi ar fi aplicate pe lista de simboluri, șiruri de caractere, date, clase de jucători și așa mai departe.

șablon Lista de clase

Utilizarea șabloanelor

Pentru a utiliza un șablon de clasă, trebuie să specificați parametrii săi:

listă li; listă ls; li.Add (17); ls.Add ("Salut!");

Detaliile tehnice

Setările șablonului

Parametrii șabloanelor pot fi: parametrii-tipuri, parametrii tipurilor obișnuite, parametrii-șabloane.

Pentru parametrii de orice tip, puteți specifica valorile implicite.

șablon

Opțiuni de șablon

Dacă doriți să utilizați același șablon într-un șablon al unei clase sau funcții, dar cu parametri diferiți, atunci sunt utilizați parametrii șablonului. De exemplu:

Nu puteți utiliza șabloanele de funcții ca parametri de șablon.

Reguli pentru derivarea argumentelor pentru un șablon de funcții

Pentru parametrii care sunt tipuri (de exemplu, parametrul T al funcției de sortare), ieșirea este posibilă dacă argumentul funcției are unul dintre următoarele tipuri:

Articole similare