Programmieren in C++ Templates

Ähnliche Dokumente
Objektorientierte Programmierung mit C++ SS 2007

Deklarationen in C. Prof. Dr. Margarita Esponda

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Kurzeinführung in C/C++ Elementare Datentypen in C++

Fortgeschrittene C++-Programmierung

Einführung in die C-Programmierung

Prof. W. Henrich Seite 1

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Repetitorium Informatik (Java)

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Einführung in die Programmierung

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

Eine Einführung in C-Funktionen

Die Programmiersprache C99: Zusammenfassung

Java Einführung Methoden. Kapitel 6

C++ - Eine Ubersicht fur Java-Programmierer

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

2. Semester, 2. Prüfung, Lösung

Java Einführung Klassendefinitionen

Angewandte Mathematik und Programmierung

Codingstandard. Softwareentwicklung Praktikum Stand:

C++-Zusammenfassung. H. Schaudt. August 18, 2005

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Tutorium Rechnerorganisation

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

Funktionen und Parameter

Einführung in die Programmierung (EPR)

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Die Kunst des schönen Kodierens

5.4 Klassen und Objekte

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

Proseminar: C# und.net. 6. Vortag Generische Klassen. Sebastian Wolf

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Zusammengesetzte Datentypen -- Arrays und Strukturen

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden:

Informatik Repetitorium SS Volker Jaedicke

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Objektorientierte Programmierung mit C++ Vector und List

Java I Vorlesung Vererbung und Sichtbarkeit

Moderne C-Programmierung

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Kurze Einführung in die Programmiersprache C++ und in Root

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung.

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Einstieg in die Informatik mit Java

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Probeklausur: Programmierung WS04/05

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Real-Life Template Meta-Programmierung

Programmieren in C++ Einführung

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Objective-C CheatSheet

Gebundene Typparameter

Beispiel 2a Die eigenen ersten Schritte mit dem Gnu-Debugger GDB für Remote-Debugging

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

JAVA - Methoden

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Grundlagen der Informatik - 6. Praktikum

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Informationsverarbeitung im Bauwesen

Objektorientiertes Programmieren für Ingenieure

Besonderheiten von C#

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

Meeting C++ C++11 R-Value Referenzen

Einführung in die Programmierung

C# im Vergleich zu Java

12) Generische Datenstrukturen

1. Übung zu "Numerik partieller Differentialgleichungen"

Programm in Source-Files aufteilen Erhöht Lesbarkeit Aufteilung orientier t sich an logischer Struktur des Programms Getrenntes Übersetzen möglich:

Nun kommt etwas wirklich Abgefahrenes. Wenn Sie zu den Leuten gehören, denen Logikrätsel keinen

C++ Templates. Betriebssystemtechnik. Motivation. Warum Templates? Überblick. Operating System Engineering (OSE)

Objektorientierte Programmierung

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Der C++ Crashkurs v1.0

Angewandte Mathematik und Programmierung

Klassen mit Instanzmethoden

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Vorkurs C++ Programmierung

Computeranwendung und Programmierung (CuP)

Ein erstes Java-Programm

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Javakurs für Anfänger

Transkript:

Programmieren in C++ Templates

Inhalt Templates Funktions- und Klassen-Templates Spezialisierung von Templates Generische Klassen Einbinden von Templates Instantiierung (implizit und explizit) Templates mit Wertparameter Member-Templates Schlüsselwort typename C++11-Erweiterungen 9-2

Templates (C++ Generics) Generische Klassen und Funktionen in C++ Template = Schablone = parametrisierbarer Typ typsichere Funktionen und Klassen Quellcode vereinfachen, flexibilisieren und in der Länge reduzieren Beispiel für überladene Funktion int min( int a, int b ) { return ( a < b )? a : b; // min for ints char min( char a, char b ) { return ( a < b )? a : b; // min for chars jetzt generisch template<typename T> T min( T a, T b ) { return ( a < b )? a : b; // generic min // Einsatz int main() { int m = min(5, 7); 9-3

Funktions-Template Deklaration template < TemplateParamListe > Funktionsdefinition mit TemplateParamListe kommaseparierte Liste von Parametern, welche Typparameter oder Wertparameter sein können einfache Beispiele class TypBezeichner typename TypBezeichner, class TypBezeichner class TypBezeichner, IntegralTypBezeichner Variable template < TemplateParamListe > TypBezeichner ein beliebiger Name, der in der Funktionsdefinition als Datentyp verwendet wird sowohl Grunddatentypen als auch Klassen sind möglich Funktionsdefinition übliche Funktionsdefinition darf auch ein überladener Operator sein 9-4

Spezialisierung von Templates Beispiel Minimum von zwei Zahlen oder Zeichen bestimmen bei Zeichen soll die Gross-/Kleinschreibung nicht beachtet werden Allgemeinfall template<typename T> T min( T a, T b ) { return ( a < b )? a : b; // generic min Spezialisierung (muss nach dem Allgemeinfall folgen) template<> char min<char>(char a, char b) { if (isupper(a)) a = _tolower(a); if (isupper(b)) b = _tolower(b); return ( a < b )? a : b; 9-5

Klassen-Templates Deklaration template < TemplateParamListe > Klassendefinition mit TemplateParamListe: siehe Funktions-Templates Beispiele von generische Klassen template<class T> class Vector { ; T* m_array; template<typename T=char> class String { ; T* m_string; // default Zeichentyp ist char 9-6

Templates mit Wert-Parameter Beispiel: statisches Array mit variabler Länge template<class T, int i> class Array { T m_array[i]; public: Array() { memset(m_array, 0, i*sizeof(t)); const T& operator[ ](int pos) const { return m_array[pos]; T& operator[ ](int pos) { return m_array[pos]; void print() const { int l = 0; cout << '['; if (i > 0) cout << m_array[l++]; while(l < i) cout << ',' << m_array[l++]; cout << ']' << endl; ; 9-7

Rekursive Templates Idee aus Templates mit Wert-Parametern und aus spezialisierten Templates können rekursive Templates mit Verankerung (Spezialisierung) erzeugt werden Beispiel template<int n> struct Zweihoch { ; enum { Wert = 2*Zweihoch<n - 1>::Wert ; template<> struct Zweihoch<0> { ; enum { Wert = 1 ; int main() { cout << Zweihoch<11>::Wert << endl; 9-8

Einbinden von Templates Klassische Aufteilung in Spezifikation und Implementierung macht bei Templates nur bedingt Sinn, weil die kompilierte Objektdatei eines Templates keinen Code und keine Daten enthält Beispiel h-file: template<typename T> T max(t a, T b); // Prototyp cpp-file: Linker: #include <h-file> template<typename T> T max(t a, T b) { return ( a > b )? a : b; unresolved external symbol "int cdecl max<int>(int,int)" Template-Dateien Templates werden oft in eigene Dateien separiert oft verwendete Dateiendungen.h: ursprünglich für C-Header-Dateien gedacht.hpp: ok, ursprünglich für C++-Header, die in C nicht verwendet werden können.cpp: ok, include einer cpp-datei ist vielleicht etwas ungewohnt.t: wird nicht von allen Compilern als C++-Datei erkannt 9-9

Alias Templates (C++11) Idee: Kurzschreibweisen ermöglichen generische Typen können unter Umständen sehr lange Bezeichner erhalten, vor allem dann, wenn mehrere generische Parameter verschachtelt werden Beispiel Array<vector<unsigned long long int>*, 50> myarray; typedef kann dann verwendet werden, wenn alle Template-Parameter voll spezifiziert worden sind Beispiel typedef Array<vector<unsigned long long int>*, 50> AV50; using (C++11) muss dann verwendet werden, wenn nicht alle Template-Parameter spezifiziert sind Beispiel template<typename T> using A50 = Array<T, 50> 9-10

Instantiierung Template Deklaration deklariert eine Funktion oder Klasse nicht vollständig definiert nur eine syntaktische Schablone für eine Funktion oder Klasse Instantiierte Funktion oder Klasse durch Instantiierung wird aus einem Template eine vollständige Funktion oder Klasse implizite (automatische) und explizite Instantiierung werden unterschieden Beispiel einer generischen Klasse template <typename T> class A { T m_t; public: A(T t): m_t(t) { void f(t t); ; // Implizite Instantiierung int main() { A<double> a(3.5); 9-11

Explizite Instantiierung Idee instantiiert ein Template ohne konkreten Gebrauch der Klasse oder Funktion, d.h. z.b. ohne die Erzeugung einer Instanz der Klasse die explizite Instantiierung generiert nur spezifizierten Code, d.h. die Typparameter sind durch konkrete Werte ersetzt worden kann die Kompilation eines grossen Projektes wesentlich beschleunigen, wenn die expliziten Instantiierungen nur an wenigen zentralen Orten vorgenommen wird Syntax template class TypBezeichner < TypBezeichner >; template TypBezeichner < TypBezeichner > ::Methode; template TypBezeichner TypBezeichner::Methode < TypBezeichner > (ParameterListe); Beispiele template class Array<double, 20>; template Array<double, 10>::Array(); extern template class Array<int, 30>; // ganze Klasse wird instantiiert // nur Konstruktor wird instantiiert // C++11: externe Instantiierung ist // bereits vorhanden 9-12

Member-Templates Idee Funktions-Templates können auch auf Instanzmethoden einer (generischen) Klasse angewendet werden Beispiel template<typename T, int i> class Array { T m_array[i]; public: Array() { memset(m_array, 0, i*sizeof(t)); ; template<typename E> bool lessthan(e a[], int size) { int k = 0, m = min(i, size); while(k < m && m_array[k] < a[k]) k++; return k < m; 9-13

Schlüsselwort typename Zweck mit dem Schlüsselwort typename wird dem Compiler mitgeteilt, dass ein unbekannter Bezeichner ein Typ ist Einsatz nur im Zusammenhang mit Template-Definitionen zwischen den spitzen Klammern: gleiche Bedeutung wie class typename muss verwendet werden, wenn der unbekannte Bezeichner ein vom Template abhängiger qualifizierter Name ist Beispiel template<typename T> class List { class Element { Element *m_next; T m_data; ; private: Element m_root; ; template<class E> class Log { typename E::Element m_el; ; 9-14

C++11-Erweiterungen Statische Zusicherungen assert überprüft die Zusicherung zur Laufzeit für Templates möchte man aber schon zur Kompilationszeit gewisse Zusicherungen überprüfen können static_assert template<typename T> class MyInt { ; static_assert(sizeof(int) <= sizeof(t), "T is not big enough"); Funktionale Schreibweise template<class LHS, class RHS> auto plus(lhs& l, RHS& r) -> decltype(l+r) { return l + r; Templates mit beliebiger Anzahl Argumente (variadic templates) template<typename Arguments> class C; 9-15

Variadic Template Beispiel (C++11) // spezialisiertes Funktionstemplate template<typename T> void kommaliste(t value) { cout << value << endl; ; // Funktion mit beliebiger Anzahl Parameter beliebigen Typs template<typename First, typename Rest > void kommaliste(first first, Rest rest) { cout << first<< ", "; kommaliste(rest ); // wird auf alle Elemente des Rest angewendet ; int main() { kommaliste(42, "hallo", 2.3, 'a'); 9-16