I den här artikeln lär du dig om mallar i C ++. Du lär dig att använda kraften i mallar för generisk programmering.
Mallar är kraftfulla funktioner i C ++ som låter dig skriva generiska program. Enkelt uttryckt kan du skapa en enda funktion eller en klass för att arbeta med olika datatyper med hjälp av mallar.
Mallar används ofta i större kodbas i syfte att återanvända kod och flexibiliteten i programmen.
Begreppet mallar kan användas på två olika sätt:
- Funktionsmallar
- Klassmallar
Funktionsmallar
En funktionsmall fungerar på samma sätt som en normal funktion, med en nyckeldifferens.
En enda funktionsmall kan fungera med olika datatyper samtidigt, men en enda normal funktion kan bara fungera med en uppsättning datatyper.
Normalt, om du behöver utföra identiska operationer på två eller flera datatyper, använder du funktionsöverbelastning för att skapa två funktioner med önskad funktionsdeklaration.
Ett bättre tillvägagångssätt skulle dock vara att använda funktionsmallar eftersom du kan utföra samma uppgiftsskrivning av mindre och underhållbar kod.
Hur deklarerar jag en funktionsmall?
En funktion mall börjar med nyckelordet mall följt av mallparameter / s inuti vilket följs av funktionsdeklarationen.
mall < klass T> T someFunction (T arg) (…)
I ovanstående kod är T ett mallargument som accepterar olika datatyper (int, float), och class är ett nyckelord.
Du kan också använda nyckelord typename
istället för klass i exemplet ovan.
När ett argument av en datatyp skickas till someFunction( )
genererar kompilatorn en ny version av someFunction()
för den angivna datatypen.
Exempel 1: Funktionsmall för att hitta det största numret
Program för att visa störst bland två nummer med hjälp av funktionsmallar.
// 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
Ange två heltal: 5 10 10 är större. Ange två flytpunkter: 12,4 10,2 12,4 är större. Ange två tecken: z Z z har större ASCII-värde.
I ovanstående program Large()
definieras en funktionsmall som accepterar två argument n1 och n2 av datatyp T
. T
betyder att argumentet kan vara av vilken datatyp som helst.
Large()
funktionen returnerar den största bland de två argumenten med en enkel villkorlig operation.
Inne i main()
funktionen variabler tre olika datatyper: int
, float
och char
deklareras. Variablerna skickas sedan till Large()
funktionsmallen som normala funktioner.
Under körning, när ett heltal skickas till mallfunktionen, vet kompilatorn att den måste generera en Large()
funktion för att acceptera int-argumenten och gör det.
På samma sätt, när flytpunktsdata och char-data skickas, känner den argumentdatatyperna och genererar Large()
funktionen därefter.
På så sätt ersatte tre identiska normala funktioner med en enda funktionsmall och gjorde din kod underhållbar.
Exempel 2: Byt data med hjälp av funktionsmallar
Program för att byta data med hjälp av funktionsmallar.
#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
Innan du skickar data till funktionsmallen. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Efter att ha skickat data till funktionsmallen. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a
I stället för att anropa en funktion genom att skicka ett värde utfärdas ett referenssamtal i detta program.
Den Swap()
funktionen mall tar två argument och swappar dem som referens.
Klassmallar
Liksom funktionsmallar kan du också skapa klassmallar för generiska klassoperationer.
Ibland behöver du en klassimplementering som är densamma för alla klasser, bara de datatyper som används är olika.
Normalt måste du skapa en annan klass för varje datatyp ELLER skapa olika medlemsvariabler och funktioner inom en enda klass.
Detta kommer att onödigt svälja din kodbas och kommer att vara svår att underhålla, eftersom en förändring är en klass / funktion bör utföras på alla klasser / funktioner.
Klassmallar gör det dock lätt att återanvända samma kod för alla datatyper.
Hur deklarerar jag en klassmall?
mall < class T> class className (… public: T var; T someOperation (T arg);…);
I ovanstående deklaration T
är mallargumentet som är en platshållare för den datatyp som används.
Inuti klassens kropp är en medlemsvariabel var och en medlemsfunktion someOperation()
båda av typ T
.
Hur skapar jag ett klassmallobjekt?
För att skapa ett klassmallobjekt måste du definiera datatypen i en när skapelse.
className classObject;
Till exempel:
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.
Sedan displayResult()
anropas av båda objekten som utför räknaroperationerna och visar utdata.