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.