Einführung in Funktionsschablonen in C++ im Rahmen der Lehre des Programmierens mit der Programmiersprache C++. (C++, Template, Templates, function, Schablone, Funktionsschablone, Funktion, Schablonen, Funktionsvorlagen), Lektion, Seite 721228
https://www.purl.org/stefan_ram/pub/c++_funktionsschablone_de (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

Funktionsschablonen in C++ 

Überladung eines Verbs

Eine Funktion soll das Maximum zweier ganzzahliger Werte berechnen.

maximum (Funktionsdefinition)
int maximum( int const a, int const b ){ return a > b ? a : b; }

Für das Verb »maximum« kann bei Bedarf auch noch eine Überladung zur Berechnung des Maximums von double -Werten definiert werden.

maximum (Funktionsdefinition)
double maximum( double const a, double const b ){ return a > b ? a : b; }

Vergleicht man die beiden Funktionsdefinitionen, so fällt auf, daß sie sich nur in ihrem Datentyp unterscheiden. In Falle von Wiederholungen in einem Programm, ist es immer wünschenswert, daß die gemeinsamen, sich wiederholenden, Teile nur einmal vorkommen.

Definieren einer Schablone

Die beiden Funktionsdefinitionen können tatsächlich durch eine einzige Funktionsdefinition ersetzt werden, für die der Datentyp offengelassen wird. Dazu muß dieser mit Hilfe einer Schablonenschreibweise abstrahiert werden.

maximum (Funktionsschablone)
template< typename T >
T maximum( T const a, T const b ){ return a > b ? a : b; }

Anwendung einer Schablone

Die Funktionsschablone kann dann angewendet werden, indem der zuvor abstrahierte Datentyp bei der Verwendung wieder angegeben wird. So ist der Wert des Ausdrucks "maximum< int>( 10, 10 )" das Maximum der beiden int -Werte und der Wert des Ausdrucks "maximum< double >( 10., 10. )" ist das Maximum der beiden double -Argumente.

Man beachte, daß der Typ des gesamten Aufrufs auch jeweils der Typ der Argumente ist, also von den Typen der Argumente abhängt: Sind die beiden Argumente vom Typ "int", so ist auch der Wert der Anwendung vom Typ "int", sind die beiden Argumente vom Typ "double", so ist auch der Wert der Anwendung vom Typ "double".

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<

template< typename T >
T maximum( T const a, T const b ){ return a > b ? a : b; }

int main()
{ ::std::cout << maximum< int >( 10, 10 )<< '\n';
::std::cout << maximum< double >( 10.0, 10.0 )<< '\n'; }

Protokoll
10
10

Das int-Argument wird nach »double« gewandelt.

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<

template< typename T >
T maximum( T const a, T const b ){ return a > b ? a : b; }

int main()
{ ::std::cout << maximum< double >( 10.0, 10 )<< '\n'; }

Protokoll
10

Anwendung ohne  Typangabe

Wenn der abstrahierte Datentyp aus dem Typ der Argumente gefolgert werden kann, dann ist allerdings keine Angabe nötig, so daß auch der Ausdruck "maximum( 10, 10 )" das Maximum der beiden int -Argumente und der Ausdruck "maximum( 10., 10. )" das Maximum der beiden double -Argumente ist.

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<

template<typename T>
T maximum( T const a, T const b ){ return a > b ? a : b; }

int main()
{ ::std::cout << maximum( 10, 10 )<< '\n';
::std::cout << maximum( 10.0, 10.0 )<< '\n'; }

Protokoll
10
10

Man beachte, daß die Schablonendefinition auch ausdrückt,

indem jedes Mal »T« verwendet wird.

Das int-Argument wird nicht  implizit nach »double« gewandelt. Hier gibt es keine impliziten Wandlungen / keine Toleranz!

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<

template< typename T >
T maximum( T const a, T const b ){ return a > b ? a : b; }

int main()
{ ::std::cout << maximum( 10.0, 10 )<< '\n'; }

Protokoll (gekürzt)
error: deduced conflicting types for parameter 'T' ('double' and 'int')

Spezialisierungen

Durch eine Spezialisierung mit »template<>« kann eine spezielle Überladung für einen bestimmten Typ festgelegt werden, die dann bevorzugt verwendet wird, falls möglich.

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string>

using namespace ::std::literals;

template< typename T >void print_type( T ){ ::std::cout << "unbekannt"s << "\n"s; }

template<> void print_type( double ){ ::std::cout << "double"s << "\n"s; }

int main()
{ print_type( 10 );
print_type( 10.0 ); }

Protokoll
unbekannt
double

Allerdings hat hier eine gewöhnliche Überladung ohne »template<>« denselben Effekt. Auch hier werden speziellere Definitionen bevorzugt aufgerufen, falls möglich.

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string>

using namespace ::std::literals;

template< typename T >void print_type( T ){ ::std::cout << "unbekannt"s << "\n"s; }

void print_type( double ){ ::std::cout << "double"s << "\n"s; }

int main()
{ print_type( 10 );
print_type( 10.0 ); }

Protokoll
unbekannt
double

Kombination mit »auto«

Um einen Operator durch eine Funktion nachzubilden, sollten zwei unterschiedliche Typen verwendet werden, da ein Operator auch mit unterschiedlichen Typen aufgerufen werden kann. Außerdem kann keine dieser beiden Typen als Ergebnistyp verwendet werden, vielmehr muß »auto« verwendet werden, um den Typ der Operatoranwendung zu übernehmen.

mul.txt
template< typename T, typename U >auto mul( T x, U y ){ return x * y; }

GCC/clang »__PRETTY_FUNCTION__«

Die Erweiterung (kein Standard-C++ !) »__PRETTY_FUNCTION__« (MSVC: »__FUNCSIG__«) ist bei einigen C++ -Implementationen zu finden und erlaubt die Anzeige der Schablonenargumentbesetzungen bei der Anwendung einer Schablone.

main.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string>

using namespace ::std::literals;

template<typename T>
void f( T x )
{ ::std::cout << __PRETTY_FUNCTION__ << '\n'; }

int main()
{ int a = 2;
f( 2 );
f( a );
f( 2.3 );
f( "2.3"s );
f( __PRETTY_FUNCTION__ ); }

Protokoll
void f(T) [with T = int]
void f(T) [with T = int]
void f(T) [with T = double]
void f(T) [with T = std::__cxx11::basic_string<char>]
void f(T) [with T = const char*]

Man könnte dies auch verwenden, um den Typ eines Ausdrucks zu bestimmen, jedoch gibt es bei der Typableitung für Schablonen einige Sonderregeln, die man dann noch kennen sollte. Daher ist der oben angezeigte Typ »const char*« nicht ganz korrekt. Außerdem wurde die Bedeutung der Schreibweise »std::__cxx11::basic_string<char>« im Kurs bisher noch nicht behandelt, gemeint ist damit aber tatsächlich »::std::string«!

Übungsfragen

?   Übungsfrage

Übungsaufgaben

/   Übungsaufgabe

Implementieren Sie ein Verb »abs_d« zur Berechnung des Betrags eines Wertes »x« vom Typ double oder int, so daß der Typ von »abs(x)« der Typ »double«.

/   Übungsaufgabe

Implementieren Sie ein Verb »abs_p« zur Berechnung des Betrags eines Wertes »x« vom Typ double oder int, so daß der Typ von »abs(x)« der Typ von »x« ist.

/   Übungsaufgabe

Implementieren Sie ein Verb »println«, die einen ihr übergebenen Wert ausgibt und die Ausgabe mit einem Zeilenende abschließt. Der Argumentausdruck jener Funktion soll den Typ »int«, »double« oder »string« haben können (darüberhinaus dürfen andere Typen aus akzeptiert werden).

/   Übungsaufgabe

Überarbeiten Sie das Verb »println« so, daß bei Verwendung eines Arguments vom Typ »::std::string«, die ausgegebene Zeichenfolge in Anführungszeichen erscheint.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram721228 stefan_ram:721228 C++, Template, Templates, function, Schablone, Funktionsschablone, Funktion, Schablonen, Funktionsvorlagen source, source code,sourcecode, Programmier sprache C++ Sprache, C++, CXX, C+, Programm, Programme, C++-Programm C++ Sprache C++ Programmiersprache C++ c++-Programme, Standard C++, Programmieren in C++, Programmieren in CXX, Programmieren in CPP, Programmieren in Cplusplus, Die Programmiersprache C++, Die Programmiersprache CXX, Die Programmiersprache CPP, Die Programmiersprache Cplusplus, Die Programmier sprache C++, Die Programmier sprache CXX, Die Programmier sprache CPP, Die Programmier sprache Cplusplus, CXX-Programmierung, C++-Programmierung, CPP-Programmierung, c-plus-plus, cpluplus-Programmierung, ANSI-C++, ANSI-CXX, ANSI-CPP, ANSI C++, ANSI CXX, ANSI-cpluscplus ISO-C++, ISO-CXX, ISO CPP, ISO C++, ISO CXX, ISO/IEC-C++, ISO/IEC-CXX, ISO/IEC CPP, ISO/IEC C++, ISO/IEC CXX, IEC-C++, IEC-CXX, IEC CPP, IEC C++, IEC CXX, International Standard ISO/IEC 14882 First edition 1998-09-01, ISO/IEC 14882:1998(E), ISO/IEC 14882:2003(E), ASC X3, 7/27/98, c plus plus, C ++, cplusplus, c plus plus, Standard C+ programmieren, Stamdard C++ programmieren, Standart C+ programmieren, Stamdart C++ programmieren, INCITS/ISO/IEC 14882-1998, Information Technology - Programming Languages - C++ (formerly ISO/IEC 14882-1998), Programmieren in C++,Programmiersprache C++ CPP CXX Cplusplus c plus plus International Standard ISO/IEC 14882 First edition 1998-09-01, Softwareentwicklung, Software-Entwicklung, Software Entwicklung, Softwareprogrammierung, Software-Programmierung, Software Programmierung, Softwareherstellung, Software-Herstellung, Software Herstellung, Softwareerstellung, Software-Erstellung, Software Erstellung, Softwareengineering, Software-Engineering, Software Engineering, Softwareenginering, Software-Enginering, Software Enginering, Softwaremethodik, Software-Methodik, Software Methodik, Programmiermethodik, Programmier-Methodik, Programmier Methodik, Softwaredidaktik, Software-Didaktik, Software Didaktik, Methodik des Programmierens, Didaktik des Programmierens, Fachdidaktik des Programmierens, Fach-Didaktik des Programmierens, Programmieren, Programmierung, Computer Science, Informatik, Informatik, Informationspädagogik, Informationspaedagogik, Programmierer, programmieren, Quellcode, Quelltext, Quelle, Quellen, Informatiker, Fachinformatiker, Entwickler, mit Stil, mit Stiel, mit Still, , Einführung, Einfuehrung, Einführungen, Einfuehrungen, eLearning-Modul, e-Learning-Modul, eLearning-Module, e-Learning-Module, Kurs Berlin, Kurse Berlin, Kursus, Vortrag, Vorträge, Vortraege, Lehrgang, Lehrgänge, Lehrgaenge, kostenloses Lehrmaterial, kostenlose Lehrmaterialien, Vorlesung, Vorlesungen, Unterrichtseinheit, Unterrichtseinheiten, kostenloses Unterrichtsmaterial im Internet, kostenlose Unterrichtsmaterialien im Internet, Ausbildung, Ausbildungen, für die Ausbildung, Fortbildung, Fortbildungen, Weiterbildung, Weiterbildungen, Schulung Berlin, Schulungen Berlin, Internetschulung, Webschulung, Kursunterlage, Kursunterlagen, trainer Berlin, Didaktik, Informatikunterricht, Primer, Skript FH, Skripte FH, Skriptum FH, Skripts FH, Script FH, Scripte FH, Scriptum FH, Scripts FH, howto, how-to, how to, Lehrbuch, Buch, Bücher, Buecher, Bericht, Crash Kurs Berlin, Crash-Kurs Berlin, Crashkurs Berlin, Report, Sachtext, Sachtexte, Übung, Übungen, Uebung, Uebungen, course, PbclevtugFgrsnaEnz, lecture note, lecture notes, Tutorial, Tutor, Tutorium, Teacher, Lehrer Berlin, Trainer Berlin, Beratung Berlin, Anleitung zum, Anleitungen zum, Einführung, Einfuehrung, Einführungen, Einfuehrungen, Handbuch für, Handbücher, Handbuecher, Support, Diplomarbeit, Facharbeit, Hausarbeit, Hausarbeiten, Werk, Werke, Text, Übungsblatt, Uebungsblatt, Lösung, Loesung, Lösungen, Loesungen, Auflösung, Aufloesung, Auflösungen, Aufloesungen, Facharbeit, Facharbeiten, Forum, Training, manual, Folie, Folien, Lehrmittel, beratung, Definition von, Allgemeine Erklärung, Allgemeine Erklaerung, Allgemeine Erklärungen, Allgemeine Erklaerung, Allgemeine Erklaerungen, Einfache Erklärung einfach, Einfache Erklaerung einfach, Einfache Erklärungen, Einfache Erklaerung, Einfache Erklaerungen, zum Thema, FAQ, FAQs, Konzept, Lernkurs, Lern-Kurs, Lernkurse, Lern-Kurse, eine kurze Erklärung, Begriff, Begriffe, Erklärung zu Begriffen, begriffbestimmung, begriffbestimmung, Begriffsbestimmung, Begriffserklärung, Begriffserklaerung, Wort, Worterklärung, Worterklaerung, Definition, Beispiel, Beispiele, Bedeutung, Bedeutungen, was bedeutet, Begriffsdefinition, für Anfänger, fuer Anfaenger, für Einsteiger, für Beginner, zum selber Lernen, handout, hand out, web based training, WBT, Net Based Training, NBT, computer based training, CBT, virtual learning environment, virtual university, für die Schule, Seminar, Seminare, Vorgehensweise, Pädagogik, Paedagogik, Akademie, Onlineacademie, Onlineakademie, Wissen, Unterrichtsvorbereitung für das Fach, Unterricht, für Lehrer, für Lehrerinnen, Referat, Referate, Hausaufgabe, Hausaufgaben, Tip, Tipp. Tipps und Tricks, Tips und Tricks, Methode, Methoden, Methodik, Funktion, Funktionsweise, Aufbau, Prinzip, Grundlage, Grundlagen, Internetschulung, Unterlage, Unterlagen, Struktur, Frage, Fragen, Antwort, Antworten, Schulunterricht, zum erlernen, was ist das?, wie?, lerne, Onlineausbildung, Onlinelehrgang, Onlinekurs, Onlinebuch, Webbuch, Academy, Fachhochschule, FH, TFH, Hochschule, Universität, Universitaet, Uni, Schule, Berufsschule, Gymnasium, Erste Schritte mit, Dozent, Dozenten, Zusammenfassung, Übersicht, Term, Fachwort, Fachbegriff, Fachbegriffe, Grundbegriff, Grundbegriffe, Lektion, Lektionen, Bedienungsanleitung, Bedienungsanleitungen, Spezialist, Spezialisten, Coaching, Coach, Fachbuch, technologie, Unterschied zwischen, Unterschiede zwischen, lehren, unterrichten, für das Studium, für Studenten, für Studentinnen, für Studierende, für Schüler, für Schülerinnen, Wie kann ich, Wie kann man, Hilfe, selber, erstellen, Erstellung, Beginner, Online-Seminar, Online-Kurs, Online-Schulung, ich, gebrauchsanweisung, gebrauchsanleitung, Bedienungsanweisung, Einweisung, Kurzinfo, Internet-Kurs, Internet-Kurse, Online-Training, Intensiv, Intensivkurs, Vortragsreihe, Präsentation, Grundzüge, Mitschrift, Mitschriften, Verständnis, verstehen, anwenden, Hintergrundwissen, Hintergrund, Hintergründe, content, Funktionsprinzip, Schritt für Schritt; E-Learning; elearning; online learning; Fernlehre, Fernlehrgang, Fernlehrgänge, Referent, Referenten, Fernkurs, Fernkurse, Fernstudium, Fernschule, Fernuniversität, Fernlehrer, Denken, Qualifizierungsmaßnahme, Qualifizierung, Qualifizierungen, Volkshochschulkurs, Volkshochschulkurse, Internet-Learning-Plattform, Online-Learning-Plattform, E-Learning-Plattform, Internetlearning-Plattform, Onlinelearning-Plattform, Elearning-Plattform, jetzt, Kochbuch, einfach erklärt, Kenntnis, Kenntniss, Kenntnisse, deutsche Hilfe, lernen und verstehen; blended learning; courseware, Profi, Profis, professionell, professionelle, professionelles, profesionell, profesionelle, profesionelles, professionel, gekonnt, für Könner, Grundkurs, Leistungskurs, Aufbaukurs, Lehrtext, Lehrtexte, Fachtext, Fachtexte, Ausarbeitung, distance learning, Online Seminar, distance education, Online Tutorium, Online Tutorien, technology-based learning, Computer based learning, CBL, Internet Based learning, IBL, Web based learning, WBL, online-learning, OL, online-training, OT, CAI, Computer Assisted Instruction, CUU, Computerunterstützter Unterricht, Computer-unterstützter Unterricht, Know how, Grundkenntnis, Grundkenntnisse, Kompetenz, Schulungsunterlagen, Insiderwissen, Rat, Lehrerinnen und Lehrer, ABC, Überblick, Arbeitsblatt, Sekundarstufe, Oberstufe, Material, Materialien, Unterrichtsentwurf, Unterrichtsentwürfe, Lerntip, Lerntips, Lerntipp, Lerntipps, ebook, schnell lernen, Lerner, Lernender, Lernende Erwachsenenbildung, Frage und Antwort, Selbststudium, Selbstudium, Umschulung, , kostenlos, kostenlose, kostenloses, kosten los, kosten lose, kosten loses, gratis, free, frei, freie, freies, privat, private, privates, homepage, home-page, home page, website, web site, webpage, web-page, web page, webpages, web-pages, web pages, webseite, Web-Seite, Webseite, Webseiten, Web-Artikel, Web Artikel, online, on-line, on line, download downloaden, down load, or, deutsch, deutsche, deutsches, deutscher, Deutschland, deutschsprachig, deutschsprachige, deutschsprachiges, german, germany, and, uebersicht, Uerbersicht, uebersichten, Uebersichten, Übersicht, übersicht, Übersichten, übersichten, Uebersicht, uebersicht, Uebersichten, uebersichten, Info, Infos zu, Information über, ueber, Informationen über, Auskunft, Auskünfte, Auskuenfte, Dienst, PbclevtugFgrsnaEnz, Angebot, Angebote, Anbieter, server, für, fuer, in, an, keyword, keywords, key word, keywords, internet, internets, net, network, net work, networks, net works, web, www, world wide web, Theorie, Praxis, Anwendung, DV, IT, glossar, fachwörterbuch it-glossar, computer lexikon, Computerlexikon, Computer-Lexikon, Lexikon, computer lexicon, Computerlexicon, Computer-Lexicon, Lexicon, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 was ist ein, was ist das, was sind, definiere, definition, define, Inhalt, html, xhtml, free im netz, PDF Text, digital, digitale, binär, binäre, elektronisch, elektronische, fachbegriff, fachbegriffe, konzept, Begriff, allgemein, allgemeine, allgemeines, Technik, Datentechnik, Digitaltechnik, Binätechnik, online lesen; , Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd721228, slrprddef721228, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/c++_funktionsschablone_de