C ++ Succinctly Maler

Introduksjon

Malfunksjoner og klasser tjener en lignende hensikt i C ++ som generiske tjener i C #. De tillater deg å bruke koden igjen uten å skrive en funksjon eller klasse for hver variant du vil ha. Så lenge typene du leverer til malen, har funksjonaliteten knyttet til dem som malen bruker, alt er bra. Hvis ikke, vil kompilatoren generere en feil. Dette skyldes at kompilatoren genererer en unik klasse for hver spesialisering du bruker. Fordi kompilatoren bygger klasser og funksjoner fra programmets maler, må malfunksjoner og klasser legges i headerfiler og defineres helt inline. På den måten kan kompilatoren analysere dem for alle kildekodefiler som bruker dem.

Til slutt kan maler bli svært komplekse. C ++ Standard Library demonstrerer kraften og kompleksiteten til avanserte maler. Til tross for det trenger du ikke en avansert kunnskap om maler for å bruke dem effektivt. En forståelse av grunnleggende for C + + -maler vil hjelpe deg å låse opp en betydelig mengde funksjonalitet og kraft.


Malfunksjoner

En malfunksjon er en frittstående funksjon som tar minst ett malargument. Det faktum at det tar et argument gjør det ufullstendig til det kalles med et konkret argument, og derved får malmen til å bli en fullstendig definert funksjon. Her er en malfunksjon som tar i to argumenter.

Eksempel: MalerSample \ PeekLastItem.h

#pragma en gang mal U PeekLastItem (T & samling) return * collection.rbegin (); 

Opprettelsen av en hvilken som helst malfunksjon eller klasse starter med søkeordsmalen etterfulgt av parametrene i pile parentes, som sett i forrige prøve med klasse T og klasse U. Bruken av ordklassen før T og U betyr ikke de Argumenter må være klasser. Tenk på klassen i stedet som et generelt ord ment å formidle meningen med en ikke-spesifikk type. Du kan ha en mal med betongtyper eller med en blanding av ikke-spesifikke klassetyper og betongtyper, for eksempel mal. Bruken av T som navnet på det første argumentet og U for et sekund er en vanlig praksis, ikke et krav. Du kan bruke nesten alt som et template argument navn.

Den forrige funksjonen tar en referanse til et element av type T. Det antas at T vil få en medlemsfunksjon kalt rbegin, som kan kalles uten argumenter og vil returnere en pekertype som når de refereres, blir et objekt av type U. Denne spesielle funksjonen er utformet primært for å fungere sammen med mange av C ++ Standardbibliotekets samlingsklasser, men hvilken som helst klasse som oppfyller forutsetningene funksjonen gjør om type T kan brukes med denne malfunksjonen. Den muligheten til å ta hvilken som helst type, legge til den nødvendige funksjonaliteten til det, og dermed gjøre det berettiget til bruk med en mal er hovedtrekk av maler.


Maleklasser

Maleklasser ligner på malfunksjoner, bare de er klasser i stedet for enkle frittstående funksjoner. La oss se på et eksempel.

Eksempel: MalerSample \ SimpleMath.h

#pragma en gang mal klasse SimpleMath public: SimpleMath (void)  ​​~ SimpleMath (void)  ​​T Legg til (T a, T b) return a + b;  T Subtrahere (T a, T b) return a - b;  T Multiply (T a, T b) return a * b;  T Del (T a, T b) return a / b; ;

Som navnet tilsier, er denne klassen ikke ment å være mer enn en demonstrasjon. Det er bare ett type argument. Når vi ser på klassen definisjonen, kan vi utlede at kravene til T i dette tilfellet er at den har følgende operatører, som alle opererer på to forekomster av T og returnerer en forekomst av T:

  • +
  • -
  • *
  • /

Selv om disse logisk tilhører tall, kan du definere disse operatørene for en hvilken som helst klasse eller datatype, og deretter ordne en forekomst av denne maleklassen, som er spesialisert for din tilpassede klasse (for eksempel en Matrix-klasse).

Et siste notat, hvis du skulle definere medlemsfunksjonene utenfor klassen definisjonen, men likevel inne i samme headerfilen, selvfølgelig, må du bruke inline-søkeordet i deklarasjonene; definisjonene ville se slik ut: SimpleMath :: SimpleMath (void) .

Dette er den siste filen i denne prøven, som viser en enkel bruk av hver av de foregående maler.

Eksempel: MalerSample \ TemplatesSample.cpp

#inkludere  #inkludere  #inkludere  #include "SimpleMath.h" #include "PeekLastItem.h" #include "... /pchar.h" ved hjelp av navneområde std; int _pmain (int / * argc * /, _pchar * / * argv * / []) SimpleMath SMF; wcout << "1.1F + 2.02F = " << smf.Add(1.1F, 2.02F) << "F." << endl; vector MT-rapporter; strs.push_back (L "Hello"); strs.push_back (L "World"); wcout << L"Last word was '" << PeekLastItem,const wchar_t *> (strs) << L"'." << endl; return 0; 

Konklusjon

Malfunksjoner hjelper deg med å gjenbruke koden, som igjen gjør kodestøtten enklere å håndtere og TØR (Gjenta ikke selv). Lambda uttrykk er gjenstand for neste artikkel i denne serien.

Denne leksjonen representerer et kapittel fra C ++ Succinctly, en gratis eBok fra teamet på Syncfusion.