C++ Templates. Wozu Templates? Definition von Templates. Gebrauch von Templates. Instanziierung und Organisation

Ähnliche Dokumente
Grundlagen der Informatik

Einführung in die C-Programmierung

Einstieg in die Informatik mit Java

C++ Templates - eine kleine Einführung. Allgemein. Funktionstemplates. Allgemein. Funktionstemplates. Klassentemplates

C++ Templates - eine kleine Einführung. Funktionstemplates. Fabian Scheler, Peter Ulbrich, Niko Böhm. 20. Oktober 2008

Programmentwicklung mit C++ (unter Unix/Linux)

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Unterprogramme, Pointer und die Übergabe von Arrays

Tag 4 Repetitorium Informatik (Java)

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Zusammenfassung. Mit bjam und ein paar Zeilen in einem Jamroot oder Jamfile lässt sich das Kompilieren und Linken einfach automatisieren

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Programmierkurs C/C++

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

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

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Problem: Vererbung erlaubt die Wiederverwendung d von Programmcode, virtuelle Funktionen ermöglichen dabei den Austausch gewisser Funktionalität

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

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

Gebundene Typparameter

Prof. W. Henrich Seite 1

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

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Programmierkurs C++ Kapitel 6 Module Seite 1

Deklarationen in C. Prof. Dr. Margarita Esponda

Erste Schritte der Programmierung in C

4. Objektorientierte Programmierung mit C++

Objektorientierung: Klassen und Objekte

Einstieg in die Informatik mit Java

C++ - Eine Ubersicht fur Java-Programmierer

Repetitorium Informatik (Java)

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Java Einführung Klassendefinitionen

Vorkurs C++ Programmierung

Überblick. 5. Objekt und Klasse, Elementfunktionen

Definition Compiler. Bekannte Compiler

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Methoden (fortgeschritten) in C# - 1

Java Einführung Methoden. Kapitel 6

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

1. Übung zu "Numerik partieller Differentialgleichungen"

Objektorientierte Programmierung mit C++ SS 2007

Tutorium Rechnerorganisation

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

Programmieren in C++ Überladen von Methoden und Operatoren

Java I Vorlesung Generics und Packages

Kapitel 8. Generische Klassen

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

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

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

Konstruktoren, Packages und Scopes

3D Programmierpraktikum: Einführung in C++ - Teil 2

Programmieren Tutorium

ALGOL 68 im Aspekt einer modernen Programmiersprache???

Einstieg in die Informatik mit Java

Programmieren I + II Regeln der Code-Formatierung

Alltagsnotizen eines Softwareentwicklers

Übungen zu Systemprogrammierung 1 (SP1)

Programmierkurs C++ Abstrakte Klassen und Methoden

Teil V. Generics und Kollektionen in Java

Fortgeschrittene C++-Programmierung

Speicherklassen (1) Lokale Variablen

Werner Achte rt DATA BECKER

Objektorientiert in C++

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Einführung in die Programmierung 1

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

JTable. W. Lang HWR Berlin, SS

Short Introduction to C# C# (C SHARP) Microsofts Antwort auf Java

2.0. Jens Weller Joel de Guzman Hartmut Kaiser

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

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

IPETRONIK TESTdrive SDK V02.00

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

Programmieren - C++ Funktions-Templates

Inhalte. Einführung. Algorithmus, Programmiersprache, Compiler und Linker. Kontrollstrukturen. Präprozessoranweisungen. Libraries

Aufbau von Klassen. class punkt {...

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

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

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

12) Generische Datenstrukturen

Java Kurs für Anfänger Einheit 5 Methoden

Abschnitt 9: Schnittstellen: Interfaces

Generische Datenstrukturen

Seminar Scala SS2010, Einführung. R. Schiedermeier Fakultät 07 für Informatik und Mathematik

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse

Präsentation Interfaces

C- Kurs 09 Dynamische Datenstrukturen

RO-Tutorien 3 / 6 / 12

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer"

FAKULTÄT FÜR INFORMATIK

4. Objektorientierte Programmierung mit C++

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

0. Einführung & Motivation

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Transkript:

C++ Templates Wozu Templates? Definition von Templates Gebrauch von Templates Instanziierung und Organisation Birgit Möller & Denis Williams AG Bioinformatik & Mustererkennung Institut für Informatik Martin-Luther-Universität Halle-Wittenberg

Wozu Templates? Generizität Klassen und Funktionen, die von Typen abhängen Funktionen denen Funktionen Übergeben werden (ohne Laufzeitkosten) (z.b. Vergleiche) Das nennt sich Polymorphismus (Übersetzungs-, Compile-Time- oder Parameter-Polymorphismus im Gegensatz zu Laufzeit-Polymorphismus, der durch virtuelle Funktionen entsteht) Geschwindigkeit Wird komplett während der Compilierung aufgelöst. So als ob man die Klassen von Hand geschrieben hätte. Angewandte Bildverarbeitung, WS 2003-2004 1

Wozu Templates? template <class matrixelement> class matrix { public: matrixelement getelem(int x, int y) { return m_rows[y][x]; } void setelem(int x, int y, matrixelement value) { m_rows[y][x] = value; } private: matrixelement **m_rows; }; ///< Pointer to each row of the matrix. matrix<int> mint; matrix<double> mdouble; class complex; matrix<complex> mcomplex; int value = 200; mint.setelem(10,20, value); Typäquivalenz Benutzung wie normale Typen Angewandte Bildverarbeitung, WS 2003-2004 2

Wozu Templates? Typprüfung und Instanziierung Bei der Template-Instanziierung werden (mindestens) alle benötigten Methoden der Template Klasse instanziiert (es entstehen sog. Spezialisierungen des Templates für ein spezielles Argument. Dann werden auch Typprüfungen durchgeführt (z.b. auch Anforderungen wie T->methode() ) Definition: template<class matrixelement> void matrix<matrixelement>::printelem(int x, int y) { getelem(x,y).print(); } mint.print(10,20); Typprüfung ergibt, dass der Typ matrixelement eine methode print() haben muss! Angewandte Bildverarbeitung, WS 2003-2004 2a

Definition von Templates Das template-schlüsselwort template<class elem, int layer = 1> class image {... } muß mit template< beginnen und endet mit dem nächsten ungeschachtelten > Parameter Bsp: image von int,float... mit verschiedenen anzahlen von Ebenen Parameter können sein: class (oder typename) - für allgemeine Typen einfache Typen - wie int,float Adressen (Pointer?!) - von Objekten oder Funktionen Funktionsnamen (Übergabe von Funktionen OHNE Laufzeitkosten!) Default Parameter sind auch möglich Angewandte Bildverarbeitung, WS 2003-2004 3

Gebrauch von Templates impliziter Gebrauch wenn klar ist, welches Template benutzt wird, braucht man das temlate nicht kenntlich machen template<class T> int g(matrix<t> &m) {... } matrix<int> m; g(m); Typ ist int g<int>(matrix<int> &); expliziter Gebrauch tempate<class T> T erzeugecopie(t) {... } int zahl = erzeuge(20.0); erzeuge<int> oder erzeuge<float>? deshalb: int zahl = erzeuge<int>(20.0); template<class T> class meineklasse {...} meineklasse<double> k; Angewandte Bildverarbeitung, WS 2003-2004 4

Gebrauch von Templates Überladen Wie andere Funktionen auch. Es können leicht Mehrdeutigkeiten auftreten -> durch expliziten Gebrauch lösen. Typedefs und Typenames Typedefs sind Typ-Synonyme, damit leichter lesbar template<class imageelement, int layers> class image {... }; typedef image<unsigned char,1> grayimage; typedef image<unsigned char,3> colorimage; Angewandte Bildverarbeitung, WS 2003-2004 5

Gebrauch von Templates auch für gleichlautenden Code benutzbar: template<class T> class mytemp1 { typedef T* iterator;... }; class mytemp2 { typedef int* iterator;... }; Damit kann man z.b. folgendes schreiben: template<class C> void f(c & c) { C::iterator i;... } dabei kann der compiler durcheinander kommen und nicht wissen, daß iterator ein Typ sein soll (er kennt ja C nicht vorher) deshalb muss man dabei C::iterator explizit als Typ deklarieren: typename C::iterator i; Angewandte Bildverarbeitung, WS 2003-2004 5a

Instanziierung und Organisation Template Instanziierung beim g++ Wie stellt der Compiler sicher, daß die entsprechende Spezialisierug an der richtigen Stelle zur Verfügung steht, und nicht doppelt vorkommt? Borland Model Compiler erzeugt Template Instanziierungen, wo immer sie benötigt werden. Der Linker erkennt dabei doppelte Instanziierungen und fasst sie zusammen. Vorteile: linker braucht nur.o files zu betrachten Nachteil: hohe Compile-Time weil template code mehrfach übersetzt wird Folge: man muss beim Erzeugen von object-files die template DEFINITION zur Verfügung stellen -> üblicherweise wird die Template-Definition in den Header geschrieben Angewandte Bildverarbeitung, WS 2003-2004 6

Instanziierung und Organisation Template Instanziierung beim g++ Cfront Model(AT&T Compiler) alle beim Übersetzen benötigten template-instanziierungen (bzw. deren definitionen) werden in einem REPOSITORY (ein Verzeichnis) gesammelt Ein Link-Wrapper übersetzt vorm linken alle notwendigen files im repository. Vorteil: man braucht keinen speziellen linker, optimale compile-time Nachteil: stark erhöhte Komplexität. Man kann nicht einfach mehrere Programme im gleichen Verzeichnis bauen oder ein Programm in mehreren Verzeichnissen! Folge: Trennung von template-definition und deklaration in separate files. g++ benutzt das Borland Model, kann aber auch mit repositories arbeiten oder die template instanziierung dem Benutzer überlassen. Angewandte Bildverarbeitung, WS 2003-2004 7

Instanziierung und Organisation explizite Template Instanziierung und ihre Probleme Wir benutzen explizite Template Instanziierung. Option -fno-implicit-templates kein code für templates erzeugen und übersetzen. Man muss dann die templates explizit instanziieren: Syntax: template volledeklaration; z.b.: template class matrix<int>; template void f<int>(matrix<int> &); Angewandte Bildverarbeitung, WS 2003-2004 7a

Instanziierung und Organisation Organisation des Quellcodes - oder: wann was wo einbinden? Trennung von Deklaration(header), normaler Methoden Definition (cc-file) und template-definitionen (tcc-file) oder (wie bei uns z.zt.:) Header enthalten auch template-definitionen aber: explizite Instanziierung in normalen files -> kein template-funktions-code + used templates.cc file mit IMPLIZITER Instanziierung und EXPLIZITEN Template-Definitionen Vorteile: alle der expliziten Instanziierung (d.h. wenig Code-Duplizierung) + einfache Generierung von std-template-library template instanziierungen Angewandte Bildverarbeitung, WS 2003-2004 8