Herleitung der Template-Parameter bei Template-Funktionen
Content |
In der Parameterliste einer Template-Funktion kann nicht nur unmittelbar einer der Typ-Parameter verwendet werden. Es ist auch möglich, davon abgeleitete Typen zu verwenden. Wenn wir sichergehen wollen, dass die Funktion print_matrix nur für Instanziierungen der Matrix-Klasse verwendet werden darf, dann können wir das so hinschreiben, indem wir den Element-Typ als Template-Parameter wählen:
template<typename T> void print_matrix(const Matrix<T>& A) { for (std::size_t i = 0; i < A.m; ++i) { for (std::size_t j = 0; j < A.n; ++j) { std::cout << " " << std::setw(8) << A(i, j); } std::cout << std::endl; } }
Bei folgendem Aufruf wird dann die Template-Funktion instantiiert mit T gleich double:
Matrix<double> A(7, 8, StorageOrder::ColMajor); /* ... */ std::cout << "A:" << std::endl; print_matrix(A);
Das hat mehrere Vorteile. Erstens ist die Funktion restriktiver bezüglich der akzeptierten Parameter. Damit können Konflikte vermieden werden. Zweitens steht der Elementtyp als T zur Verfügung. Das kann so manches einfacher machen, auch wenn decltype-Konstruktionen auch hätten genutzt werden können, um den Typ zu ermitteln.
Aufgabe
Schreiben Sie eine Template-Funktion sum, die alle Elemente einer Matrix aufsummiert.