Specializare șablon parțială

Specializarea parțială a șablonului  este un mecanism de limbaj de programare C++ conceput pentru a specializa clase de șabloane generice pentru sarcini specifice sau pentru un subset specific al tipurilor lor de date parametrizate [1] . Potrivit omului de știință american și creatorul C++ B. Stroustrup , specializarea șablonului este un mijloc eficient de a preveni creșterea necontrolată a volumelor de cod prin utilizarea activă a instrumentelor de clasă șablon, chiar și atunci când se dezvoltă proiecte software de dimensiuni medii. Acest lucru se datorează faptului că nu permite generarea de replici redundante de cod pentru fiecare tip de date specific, înlocuirea acestora cu fragmente de cod mai generalizate și, în plus, reducerea timpului de compilare și legare a produsului final [2] .

Specializare completă explicită

În C++, specializarea explicită a unui tip de date parametrizate (șablon) se realizează prin crearea unei clase de șablon suplimentare în care parametrii de intrare ai clasei primare sunt redefiniți complet sau parțial de tipuri de date specifice [1] [3] .

Sintaxa pentru o astfel de înlocuire este următoarea [4] :

template < lista parametrilor de intrare a clasei de șablon > clasa | struct | union class_name < listă de argumente de clasă șablon > _ _

De exemplu [1] :

// șablon de clasă primară < Typename Window , typename Controller > class Widget { /* ... implementarea clasei Widget parametrizate pentru orice fel de fereastră și orice handler de evenimente Controller */ }; // specializarea explicită a șablonului de clasă primară <> class Widget < DialogWindow , DialogController > { /* ... implementarea clasei Widget pentru lucrul cu caseta de dialog DialogWindow și cu gestionarea de evenimente a casetei de dialog DialogController */ };

Se observă că definițiile tipurilor de date conținute într-o clasă primară nu sunt niciodată folosite pentru a instanția membrii specializării sale parțiale. Totuși, implementarea de cod a versiunilor specializate ale clasei primare nu are nimic de-a face cu aceasta și poate conține un set de membri care nu au nicio legătură cu membrii clasei primare [4] .

În etapa de generare a codului, compilatorul, atunci când caută un șablon potrivit, comandă parțial variantele de specializare de clasă primară de care dispune și o selectează pe cea mai potrivită dintre acestea. Dacă nu există, atunci compilatorul generează un mesaj de eroare [4] .

Specializare parțială

O specializare parțială a unui șablon de clasă este definită ca o configurație a parametrilor unei clase primare care servește ca argument pentru implementarea specializată. Un exemplu de astfel de specializare este orice clasă container implementată pentru a stoca obiecte pointer [2] [5] :

// șablon de clasă primară < typename T > clasa Vector { /* ... implementarea clasei container pentru obiecte de tip T... */ }; // specializarea parțială a clasei primare pentru a stoca șablonul de pointeri < typename T > clasa Vector < T *> { /* ... implementarea clasei container pentru pointeri către obiecte de tip T... */ };

În acest caz, argumentul parametrului șablonului nu este o expresie transmisă șablonului ca argument, ci este derivat din constructul de argument bazat pe șablonul clasei primare declarate [2] .

Specializarea parțială a metodelor individuale ale unei clase de șablon parametrizate nu este permisă [1] , iar specializarea parțială nu este permisă pentru a utiliza parametrii impliciti [5] .

Exemplu

Utilizarea flexibilă a specializării șabloane parțiale vă permite să efectuați în mod eficient unele tipuri de calcule non-triviale. De exemplu, o compoziție destul de simplă a claselor poate ajuta la calcularea structurii (numărului de dimensiuni) unui tablou multidimensional cu elemente de tip necunoscut anterior [5] :

// șablon de clasă primară < clasa T > struct RankOfArray { static const int valoare = 0 ; }; // șablon de clasă recurentă parțial specializată < class T , int N > struct RankOfArray < T [ N ] > { static const int value = 1 + RankOfArray < T >:: value ; };

Vezi și

Note

  1. 1 2 3 4 Alexandrescu A. 2.2 Partial Template Specialization // Design modern C++: Generic Programming and Design Patterns Applied. - Addison Wesley, 2001. - P. 22-23. — 352 p. - ISBN 0-201-70431-5 .
  2. 1 2 3 Stroustrup B. 25.3 Specializare // Limbajul de programare C++. — ediția a IV-a. - Addison-Wesley, 2013. - P. 730. - ISBN 978-0-321-56384-2 .
  3. Baumann R. 3.1 Specializarea explicită // O reflecție profundă asupra mecanismului șablonului C++. - Zurich: Institutul Federal Elvețian de Tehnologie ETH, 2002. - P. 10.
  4. 1 2 3 Pobegailo A.P. 19.5 Specializarea parțială a unui șablon de clasă // C/C++ pentru studenți. - BHV-Petersburg, 2006. - S. 265. - 528 p. — (calculatoare). — ISBN 5-94157-647-1 .
  5. 1 2 3 Baumann R. 3.2 Specializarea parțială a șablonului de clasă // O reflecție profundă asupra mecanismului șablonului C++. - Zurich: Institutul Federal Elvețian de Tehnologie ETH, 2002. - P. 13.

Link -uri