========================================================= Herleitung der Template-Parameter bei Template-Funktionen [TOC] ========================================================= 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: ---- CODE (type=cpp) ---------------------------------------------------------- template void print_matrix(const Matrix& 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_: ---- CODE (type=cpp) ---------------------------------------------------------- Matrix 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. :navigate: up -> doc:index back -> doc:session04/page04 next -> doc:session04/page06