Grundlegendes zum Abzug von Vorlagenargumenten in Funktionsvorlagen
Betrachten Sie den folgenden Code, in dem eine Funktionsvorlage cal_size zum Berechnen und Drucken der Größe von Arrays verwendet wird :
#include <iostream> template <typename T, size_t N> void cal_size(T (&a)[N]) { std::cout << "size of array is: " << N << std::endl; }
Wenn das Programm ausgeführt wird, druckt es für beide die richtige Größe Arrays:
int a[] = {1,2,3,4,5,6}; int b[] = {1}; cal_size(a); cal_size(b);
Wie leitet die Vorlagenfunktion cal_size also automatisch die Größe der übergebenen Arrays ab, auch wenn die Größe nicht explizit als Argument übergeben wird?
Die Antwort liegt in das Konzept der Template-Argument-Ableitung in C. So funktioniert es:
Während der Kompilierung führt der Compiler eine Vorlagenargumentableitung durch, um den Typ von T und den Wert von N basierend auf dem tatsächlichen Typ des an die Vorlagenfunktion übergebenen Arguments zu bestimmen. Wenn in diesem Fall cal_size mit dem Argument a aufgerufen wird, leitet der Compiler T als int und N als 6 ab und erstellt zur Kompilierungszeit eine spezialisierte Funktion cal_size_int_6:
void cal_size_int_6(int (&a)[6]) { std::cout << "size of array is: " << 6 << std::endl; }
Ähnlich gilt für das Argument b die Der Compiler leitet T als int und N als 1 ab, was zur Spezialisierung führt cal_size_int_1:
void cal_size_int_1(int (&a)[1]) { std::cout << "size of array is: " << 1 << std::endl; }
Daher erstellt die ursprüngliche cal_size-Vorlage effektiv zwei separate Funktionsspezialisierungen, jede mit ihren eigenen fest codierten T- und N-Werten. Dieser Prozess stellt sicher, dass bei jedem Aufruf von cal_size.
die richtige Array-Größe gedruckt wirdDas obige ist der detaillierte Inhalt vonWie bestimmt die Ableitung von C-Vorlagenargumenten die Array-Größen in Funktionsvorlagen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!