In diesem Artikel erfahren Sie mehr über Vorlagen in C ++. Sie lernen, die Leistungsfähigkeit von Vorlagen für die allgemeine Programmierung zu nutzen.
Vorlagen sind leistungsstarke Funktionen von C ++, mit denen Sie generische Programme schreiben können. In einfachen Worten können Sie eine einzelne Funktion oder Klasse erstellen, um mithilfe von Vorlagen mit verschiedenen Datentypen zu arbeiten.
Vorlagen werden häufig in größeren Codebasen verwendet, um die Wiederverwendbarkeit und Flexibilität der Programme zu gewährleisten.
Das Konzept von Vorlagen kann auf zwei verschiedene Arten verwendet werden:
- Funktionsvorlagen
- Klassenvorlagen
Funktionsvorlagen
Eine Funktionsvorlage funktioniert ähnlich wie eine normale Funktion, mit einem wesentlichen Unterschied.
Eine einzelne Funktionsvorlage kann mit verschiedenen Datentypen gleichzeitig arbeiten, eine einzelne normale Funktion kann jedoch nur mit einem Satz von Datentypen arbeiten.
Wenn Sie identische Operationen für zwei oder mehr Datentypen ausführen müssen, verwenden Sie normalerweise die Funktionsüberladung, um zwei Funktionen mit der erforderlichen Funktionsdeklaration zu erstellen.
Ein besserer Ansatz wäre jedoch die Verwendung von Funktionsvorlagen, da Sie dieselbe Aufgabe ausführen können, indem Sie weniger und wartbaren Code schreiben.
Wie deklariere ich eine Funktionsvorlage?
Eine Funktionsschablone beginnt mit dem Schlüsselwort Vorlage gefolgt von Template - Parameter / s innerhalb der durch Funktionsdeklaration folgt.
Vorlage < Klasse T> T someFunction (T arg) (…)
Im obigen Code ist T ein Vorlagenargument, das verschiedene Datentypen (int, float) akzeptiert, und class ist ein Schlüsselwort.
Sie können typename
im obigen Beispiel auch ein Schlüsselwort anstelle einer Klasse verwenden.
Wenn ein Argument eines Datentyps übergeben wird someFunction( )
, generiert der Compiler eine neue Version von someFunction()
für den angegebenen Datentyp.
Beispiel 1: Funktionsvorlage zum Ermitteln der größten Anzahl
Programm zur Anzeige der größten unter zwei Zahlen mithilfe von Funktionsvorlagen.
// 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; )
Ausgabe
Geben Sie zwei Ganzzahlen ein: 5 10 10 ist größer. Geben Sie zwei Gleitkommazahlen ein: 12.4 10.2 12.4 ist größer. Geben Sie zwei Zeichen ein: z Z z hat einen größeren ASCII-Wert.
Im obigen Programm ist eine Funktionsvorlage Large()
definiert, die zwei Argumente n1 und n2 vom Datentyp akzeptiert T
. T
bedeutet, dass das Argument von einem beliebigen Datentyp sein kann.
Large()
Die Funktion gibt das größte der beiden Argumente mit einer einfachen bedingten Operation zurück.
Innerhalb der main()
Funktion, Variablen von drei verschiedenen Datentypen: int
, float
und char
deklariert. Die Variablen werden dann Large()
als normale Funktionen an die Funktionsvorlage übergeben.
Wenn zur Laufzeit eine Ganzzahl an die Vorlagenfunktion übergeben wird, weiß der Compiler, dass er eine Large()
Funktion generieren muss , um die int-Argumente zu akzeptieren, und tut dies auch.
In ähnlicher Weise kennt es bei der Übergabe von Gleitkommadaten und Zeichendaten die Argumentdatentypen und generiert die Large()
Funktion entsprechend.
Auf diese Weise ersetzte die Verwendung nur einer einzigen Funktionsvorlage drei identische normale Funktionen und machte Ihren Code wartbar.
Beispiel 2: Daten mit Funktionsvorlagen austauschen
Programm zum Austauschen von Daten mithilfe von Funktionsvorlagen.
#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; )
Ausgabe
Vor dem Übergeben von Daten an die Funktionsvorlage. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Nach Übergabe der Daten an die Funktionsvorlage. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a
In diesem Programm wird anstelle eines Aufrufs einer Funktion durch Übergabe eines Werts ein Aufruf per Referenz ausgegeben.
Die Swap()
Funktionsvorlage verwendet zwei Argumente und tauscht sie als Referenz aus.
Klassenvorlagen
Wie Funktionsvorlagen können Sie auch Klassenvorlagen für generische Klassenoperationen erstellen.
Manchmal benötigen Sie eine Klassenimplementierung, die für alle Klassen gleich ist. Nur die verwendeten Datentypen sind unterschiedlich.
Normalerweise müssten Sie für jeden Datentyp eine andere Klasse erstellen ODER verschiedene Elementvariablen und Funktionen innerhalb einer einzelnen Klasse erstellen.
Dies wird Ihre Codebasis unnötig aufblähen und ist schwer zu pflegen, da eine Änderung darin besteht, dass eine Klasse / Funktion für alle Klassen / Funktionen ausgeführt werden sollte.
Klassenvorlagen erleichtern jedoch die Wiederverwendung des gleichen Codes für alle Datentypen.
Wie deklariere ich eine Klassenvorlage?
template < Klasse T> Klasse className (… public: T var; T someOperation (T arg);…);
In der obigen Deklaration T
ist das Vorlagenargument ein Platzhalter für den verwendeten Datentyp.
Innerhalb des Klassenkörpers sind eine Mitgliedsvariable var und eine Mitgliedsfunktion someOperation()
vom Typ T
.
Wie erstelle ich ein Klassenvorlagenobjekt?
Um ein Klassenvorlagenobjekt zu erstellen, müssen Sie den Datentyp innerhalb einer beim Erstellen definieren.
className classObject;
Beispielsweise:
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.
Dann wird displayResult()
von beiden Objekten aufgerufen, was die Rechneroperationen ausführt und die Ausgabe anzeigt.