C ++ skabeloner

I denne artikel lærer du om skabeloner i C ++. Du lærer at bruge magt skabeloner til generisk programmering.

Skabeloner er effektive funktioner i C ++, som giver dig mulighed for at skrive generiske programmer. Enkelt sagt kan du oprette en enkelt funktion eller en klasse til at arbejde med forskellige datatyper ved hjælp af skabeloner.

Skabeloner bruges ofte i større codebase med henblik på genanvendelighed af kode og programmernes fleksibilitet.

Begrebet skabeloner kan bruges på to forskellige måder:

  • Funktionsskabeloner
  • Klasseskabeloner

Funktionsskabeloner

En funktionsskabelon fungerer i lighed med en normal funktion med en nøgleforskel.

En enkelt funktionsskabelon kan arbejde med forskellige datatyper på én gang, men en enkelt normal funktion kan kun fungere med et sæt datatyper.

Normalt, hvis du har brug for at udføre identiske operationer på to eller flere datatyper, bruger du funktionsoverbelastning til at oprette to funktioner med den krævede funktionserklæring.

En bedre tilgang ville dog være at bruge funktionsskabeloner, fordi du kan udføre den samme opgave med at skrive mindre og vedligeholdelig kode.

Hvordan erklæres en funktionsskabelon?

En funktion skabelon starter med nøgleordet skabelon efterfulgt af skabelon parameter / s inde som efterfølges af funktionen erklæring.

 skabelon < klasse T> T someFunction (T arg) (…)

I ovenstående kode er T et skabelonargument, der accepterer forskellige datatyper (int, float), og klasse er et nøgleord.

Du kan også bruge nøgleord i typenamestedet for klasse i ovenstående eksempel.

Når et argument af en datatype sendes til someFunction( ), genererer kompilatoren en ny version af someFunction()for den givne datatype.

Eksempel 1: Funktionsskabelon for at finde det største tal

Program til at vise størst blandt to tal ved hjælp af funktionsskabeloner.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Produktion

Indtast to heltal: 5 10 10 er større. Indtast to flydende numre: 12.4 10.2 12.4 er større. Indtast to tegn: z Z z har større ASCII-værdi.

I ovenstående program Large()defineres en funktionsskabelon, der accepterer to argumenter n1 og n2 af datatypen T. Tbetyder, at argumentet kan være af enhver datatype.

Large() -funktionen returnerer den største blandt de to argumenter ved hjælp af en simpel betinget operation.

Inde i main()funktion, variabler af tre forskellige datatyper: int, floatog chardeklareres. Variablerne sendes derefter til Large()funktionsskabelonen som normale funktioner.

Under kørselstid, når et heltal sendes til skabelonfunktionen, ved compiler, at den skal generere en Large()funktion for at acceptere int-argumenterne og gør det.

På samme måde kender den data-typerne for flydende data og char-data, og genererer Large()funktionen i overensstemmelse hermed.

På denne måde erstattede brug af kun en enkelt funktionsskabelon tre identiske normale funktioner og gjorde din kode vedligeholdelig.

Eksempel 2: Byt data ved hjælp af funktionsskabeloner

Program til at bytte data ved hjælp af funktionsskabeloner.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Produktion

Før du videregiver data til funktionsskabelonen. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Efter overførsel af data til funktionsskabelon. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

I stedet for at ringe til en funktion ved at sende en værdi i dette program, udstedes der et kald ved reference.

Den Swap()funktionsskabelon tager to argumenter og swaps dem som reference.

Klasseskabeloner

Ligesom funktionsskabeloner kan du også oprette klasseskabeloner til generiske klassehandlinger.

Nogle gange har du brug for en klasseimplementering, der er den samme for alle klasser, kun de anvendte datatyper er forskellige.

Normalt skal du oprette en anden klasse for hver datatype ELLER oprette forskellige medlemsvariabler og funktioner inden for en enkelt klasse.

Dette spreder din kodebase unødigt og vil være vanskelig at vedligeholde, da en ændring er en klasse / funktion skal udføres på alle klasser / funktioner.

Klasseskabeloner gør det dog let at genbruge den samme kode til alle datatyper.

Hvordan erklærer jeg en klasseskabelon?

 skabelon < klasse T> klasse klasse Navn (… offentlig: T var; T nogetOperation (T arg);…);

I ovenstående erklæring Ter skabelonargumentet, der er en pladsholder for den anvendte datatype.

Inde i klassekroppen er en medlemsvariabel var og en medlemsfunktion someOperation()begge af typen T.

Hvordan oprettes et klasseskabelonobjekt?

For at oprette et klasseskabelonobjekt skal du definere datatypen i en når oprettelse.

 className classObject; 

For eksempel:

 className classObject; className classObject; className classObject; 

Example 3: Simple calculator using Class template

Program to add, subtract, multiply and divide two numbers using class template

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Output

 Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1 & num2, and a constructor to initalize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Derefter displayResult()kaldes begge objekter, der udfører lommeregneroperationerne og viser output.

Interessante artikler...