C ++ Succinct Șabloane

Introducere

Șabloanele și clasele servesc unui scop similar în C ++, deoarece genericele servesc în C #. Acestea vă permit să reutilizați codul fără să scrieți o funcție sau o clasă pentru fiecare variantă pe care o doriți. Atâta timp cât tipurile pe care le furnizați șablonului au funcționalitatea asociată cu șabloanele folosite, totul este bine. Dacă nu, compilatorul va genera o eroare. Acest lucru se datorează faptului că compilatorul generează o clasă unică pentru fiecare specializare pe care o utilizați. Deoarece compilatorul construiește clase și funcții din șabloanele programului, funcțiile și clasele șablonului trebuie să fie puse în fișiere antet și definite în întregime în linie. În acest fel, compilatorul le poate parsa pentru toate fișierele de cod sursă care le utilizează.

În cele din urmă, șabloanele pot deveni foarte complexe. Biblioteca standard C ++ demonstrează puterea și complexitatea șabloanelor avansate. Cu toate acestea, nu aveți nevoie de o cunoaștere avansată a șabloanelor pentru a le utiliza în mod eficient. O înțelegere a fundamentelor șabloanelor C ++ vă va ajuta să deblocați o cantitate semnificativă de funcționalitate și putere.


Șabloane Funcții

Funcția șablon este o funcție autonomă care ia cel puțin un argument pentru șablon. Faptul că are nevoie de un argument o face incompletă până când este apelată cu un argument concret, determinând astfel șablonul să devină o funcție definită. Aici este o funcție de șablon care are două argumente.

Exemplu: ȘabloaneSample \ PeekLastItem.h

#pragma o dată șablon U PeekLastItem (colecția T) return * collection.rbegin (); 

Crearea oricărei funcții de șablon sau a unei clase începe cu șablonul de cuvinte cheie urmat de parametrii din parantezele săgeților, așa cum se vede în proba precedentă cu clasa T și clasa U. Utilizarea clasei de cuvinte înainte de T și U nu înseamnă acelea argumentele trebuie să fie clase. Gândiți-vă mai degrabă la clasă, ca la un cuvânt general destinat să transmită semnificația unui tip nespecific. Ați putea avea un șablon cu tipuri concrete sau cu un amestec de tipuri de clase nespecifice și tipuri de beton, cum ar fi șablon. Utilizarea T ca nume pentru primul argument și U pentru o secundă este o practică obișnuită, nu o cerință. Ai putea folosi aproape orice ca nume de argument pentru șablon.

Funcția anterioară ia o referință la un element de tip T. Se presupune că T va avea o funcție de membru numită rbegin, care poate fi apelat fără argumente și va întoarce un tip de pointer care, atunci când va fi dereferențiat, va deveni un obiect de tip U. Această funcție particulară este concepută în primul rând pentru a lucra cu multe dintre clasele de colecție ale Bibliotecii Standard C ++, deși orice clasă care îndeplinește ipotezele pe care le face funcția despre tipul T, pot fi utilizate cu această funcție de șablon. Această abilitate de a lua orice tip, de a adăuga funcționalitatea necesară și de ao face eligibilă pentru utilizare cu un șablon este principala remiză a șabloanelor.


Șabloane de șabloane

Clasele de șabloane sunt similare cu funcțiile șablonului, ci doar clase, nu simple funcții independente. Să ne uităm la un exemplu.

Mostră: exemple de șabloane \ SimpleMath.h

#pragma o dată șablon clasa SimpleMath public: SimpleMath (void)  ​​~ SimpleMath (void)  ​​T Adăugați (T a, T b) return a + b;  T Subtract (T a, T b) returnați a - b;  T Multiplicați (T a, T b) returnați a * b;  T Divide (T a, T b) returnați a / b; ;

După cum sugerează și numele, această clasă nu trebuie să fie mai mult decât o demonstrație. Există doar un singur tip de argument. Privind la definiția clasei, putem deduce că cerințele pentru T în acest caz sunt că are următorii operatori, toți operând pe două instanțe ale T și returnează o instanță a T:

  • +
  • -
  • *
  • /

În timp ce acestea aparțin în mod logic numerelor, puteți defini acești operatori pentru orice clasă sau tip de date și apoi instanțiați o instanță a acestei clase de șabloane, care este specializată pentru clasa personalizată (de exemplu, o clasă Matrix).

O ultimă notă, dacă ați defini funcțiile membrului în afara definiției clasei, dar în interiorul aceluiași fișier de antet, desigur, va trebui să utilizați cuvântul cheie inline în declarații; definițiile ar arăta astfel: SimpleMath :: SimpleMath (void) .

Acesta este ultimul fișier din acest eșantion, care arată o utilizare simplă a fiecăreia dintre șabloanele precedente.

Mostră: TemplateSample \ TemplatesSample.cpp

#include  #include  #include  #include "SimpleMath.h" #include "PeekLastItem.h" #include "... /pchar.h" folosind namespace std; int _pmain (int / * argc * /, _pchar * / * argv * / []) SimpleMath smf; wcout << "1.1F + 2.02F = " << smf.Add(1.1F, 2.02F) << "F." << endl; vector ; RTS strs.push_back (L "Hello"); strs.push_back (L "World"); wcout << L"Last word was '" << PeekLastItem,const wchar_t *> (strs) << L"'." << endl; return 0; 

Concluzie

Funcțiile de șablon vă ajută să reutilizați codul, ceea ce face ca baza de cod să fie mai ușor de gestionat și DRY (Do not Repeat Yourself). Expresiile Lambda fac obiectul următorului articol din această serie.

Această lecție reprezintă un capitol din C ++ Succinctly, o carte electronică gratuită de la echipa de la Syncfusion.
Cod