Metaprogrammierung in C/C++

Ähnliche Dokumente
Programmieren in C++ Templates

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

Praxisorientierte Einführung in C++ (Variadische Funktionen)

Die Anwesenheitspflicht beim Seminar gilt für diejenigen Teilnehmer, die einen Schein erwerben wollen. Für die Nachmittagsübungen gilt keine

variadic templates Templates mit variabler Argumentanzahl?

kurze Wiederholung class templates

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Angewandte Mathematik und Programmierung

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

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Polymorphismus 44. Function.hpp. #include <string>

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

Crashkurs C++ Wiederholung

4. Objektorientierte Programmierung mit C++

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmierkurs C++ Templates & STL (1/2)

Container/ Collection: Klasse die (Pointer auf ) andere Klassen oder Typen int,char,bool etc. aufnimmt.

Grundlagen der Informatik 12. Strukturen

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

Fortgeschrittene Template-Techniken 295

Repetitorium Programmieren I + II

K Ergänzungen zur Einführung in C

initializer lists (nicht für Referenzen... unklar warum...)

Algorithmen und Datenstrukturen

FACHHOCHSCHULE MANNHEIM

Programmieren - C++ Templates

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Objektorientierte Programmierung mit C++ SS 2007

Repetitorium Programmieren I + II

12/18/12 // POST: values of a and b are interchanged void swap (int& a, int& b) { int c = a; a = b; b = c;

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

Polymorphismus 179. Function.h. #include <string>

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Objektorientierte Programmierung II

Variablen und Parameter

PVK Informatik I 1.Teil. Grundlagen Variablen Operatoren Fallunterscheidung Schleifen Kurzschreibweise Pointer Array Dynamische Strukturen Funktionen

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

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

Centrum für Informations- und Sprachverarbeitung SoSe 2018: Höhere Programmierung mit C++ Andreas Krieger. Musterlösung 9

Programmieren - C++ Funktions-Templates

Lösung der OOP-Prüfung WS12/13

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

C++ Templates - eine kleine Einführung

Programmieren in Java

Polymorphe for-anweisung 237

Unterlagen. CPP-Uebungen-08/

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Programmierung und Angewandte Mathematik

C++ Klassen weitere Funktionen

Funktionen: Rückgabewert

Einstieg in die Informatik mit Java

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Modellierung und Programmierung 1

Ein kleiner Blick auf die generische Programmierung

C++ Quellcodes zum Buch Kapitel 5

Konstruktor/Destruktor

Fortgeschrittene Template-Techniken 350

1 Einleitung Generizität Syntax... 2

C/C++ Programmierung

Praxis der Programmierung

C++ vs. Java. Hello world! Java C++ class HelloWorld { static public void main(string args) { System.out.println("Hello World!

HSR Rapperswil 2001 Markus Rigling. Programmieren: Exceptions Auflage

Programmieren in Java

Programmierkurs. Steffen Müthing. December 7, Interdisciplinary Center for Scientific Computing, Heidelberg University

HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

Name: Klausur Informatik III WS 2003/04

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Repetitorium Programmieren I + II

Proseminar. C-Programmierung Grundlagen und Konzepte. Der Präprozessor. von: Svenja Neef

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

Informatik I (D-ITET)

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Informatik. Strukturen und Aufzählungstypen. Vorlesung

Einführung in die STL

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

16. Structs und Klassen I. Rationale Zahlen, Struct-Definition, Operator-Überladung, Datenkapselung, Klassen-Typen

Funktionen in Python

Informatik I (D-ITET)

C++ - Objektorientierte Programmierung Polymorphie

2. Unterprogramme und Methoden

Syntax und Kontrollstrukturen

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

17. Klassen. Datenkapselung, Klassen, Memberfunktionen, Konstruktoren

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Tag 4 Repetitorium Informatik (Java)

Neuere Sprachelemente in Java

Implementieren von Klassen

Klassenvariablen, Klassenmethoden

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Herzlich willkommen!

Generative Programmierung

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Polymorphie. Überladen. Definition Methodennamen überladen Konstruktoren überladen Operatoren überladen Beispiele. Dr.

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

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

Grundlagen von C# - 1

Transkript:

Metaprogrammierung in C/C++ Vortrag im WP Deeply Embedded Philipp Bandow Jakob Kasicz Orhan Aykac

Inhalt 1 Metaprogrammierung mit dem Präprozessor 2 Templates Einleitung Parameter und Typen Abhängige Namen Benutzung Explizite Spezialisierung Partielle Spezialisierung Beispiele 3 Code Bloat Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 2/83

Metaprogrammierung mit dem Präprozessor Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 3/83

Metaprogrammierung mit dem Präprozessor Sprachelemente stammen aus C Verwendbar auch in C++ Hauptsächlicher Einsatzzweck: Wiederholung oder Manipulation von bereits vorhandenem Code Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 4/83

Präprozessor Direktiven (C-Makros) Werden mit der #define Direktive erstellt Quellcode wird vom Präprozessor bearbeitet und alle mit #define erstellten Makros werden ersetzt Meistens werden Makros für Konstanten verwendet (eher in C als in C++), sie können aber auch verschachtelt werden Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 5/83

Einfache Makros (der Vollständigkeit halber) 1 # define NUM 42 2 # define STRING " ein String \n" 3... 4 cout << STRING << endl ; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 6/83

Mehrzeilige Makros Das \-Zeichen erlaubt es Makros, welche normalerweise Einzeiler sind, trotzdem in mehreren Zeilen zu schreiben Man sollte allerdings beachten, dass der Präprozessor die Makros trotzdem als Einzeiler verarbeitet 1 # define STRINGOUT cout << " Stringdingdong " \ 2 endl ; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 7/83

Parametersubstitution Makros dürfen ähnlich wie Funktionen parametriert werden Man kann an dem Beispiel erkennen das es KEINE Typüberprüfung gibt Es darf fast jedes Wort als Parameter übergeben werden, es dürfen allerdings keine, vorkommen, da diese die Parameter trennen! Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 8/83

Parametersubstitution Makros dürfen ähnlich wie Funktionen parametriert werden Man kann an dem Beispiel erkennen das es KEINE Typüberprüfung gibt Es darf fast jedes Wort als Parameter übergeben werden, es dürfen allerdings keine, vorkommen, da diese die Parameter trennen! Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 8/83

Parametersubstitution Makros dürfen ähnlich wie Funktionen parametriert werden Man kann an dem Beispiel erkennen das es KEINE Typüberprüfung gibt Es darf fast jedes Wort als Parameter übergeben werden, es dürfen allerdings keine, vorkommen, da diese die Parameter trennen! Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 8/83

Klammern von Parametern Wie erwähnt ist eine Markodefinition eine reine Substitution, von daher ist gerade bei mathematischen Ausdrücken Vorsicht geboten und es ist gängige Praxis viel zu Klammern 1 # define SQRE1 (x) ((x) * (x)) 2 # define SQRE2 (x) (x * x) 1 int a= SQRE1 (5+1) ; // a= ((5+1) *(5+1) )= 36 2 int b= SQRE2 (5+1) ; // b= (5+1*5+1) = 11 Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 9/83

Klammern von Parametern Wie erwähnt ist eine Markodefinition eine reine Substitution, von daher ist gerade bei mathematischen Ausdrücken Vorsicht geboten und es ist gängige Praxis viel zu Klammern 1 # define SQRE1 (x) ((x) * (x)) 2 # define SQRE2 (x) (x * x) 1 int a= SQRE1 (5+1) ; // a= ((5+1) *(5+1) )= 36 2 int b= SQRE2 (5+1) ; // b= (5+1*5+1) = 11 Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 9/83

Klammern von Parametern Wie erwähnt ist eine Markodefinition eine reine Substitution, von daher ist gerade bei mathematischen Ausdrücken Vorsicht geboten und es ist gängige Praxis viel zu Klammern 1 # define SQRE1 (x) ((x) * (x)) 2 # define SQRE2 (x) (x * x) 1 int a= SQRE1 (5+1) ; // a= ((5+1) *(5+1) )= 36 2 int b= SQRE2 (5+1) ; // b= (5+1*5+1) = 11 Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 9/83

Variadic Makros Variadic Makros sind Makros mit einer Parameterliste, diese ist Variabel und wird mit (...) angegeben. Die Übergabe findet mit dem vordefinierten VA ARGS Makro statt 1 # define ERROR (...) \ 2 printf (" file : %s, line : %d, error : ", ) \ 3 FILE, LINE, VA_ARGS ) 1 int main ( void ) { 2 ERROR (" Dies ist Fehler Nr %d", 100) ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 10/83

Variadic Makros Variadic Makros sind Makros mit einer Parameterliste, diese ist Variabel und wird mit (...) angegeben. Die Übergabe findet mit dem vordefinierten VA ARGS Makro statt 1 # define ERROR (...) \ 2 printf (" file : %s, line : %d, error : ", ) \ 3 FILE, LINE, VA_ARGS ) 1 int main ( void ) { 2 ERROR (" Dies ist Fehler Nr %d", 100) ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 10/83

Variadic Makros Variadic Makros sind Makros mit einer Parameterliste, diese ist Variabel und wird mit (...) angegeben. Die Übergabe findet mit dem vordefinierten VA ARGS Makro statt 1 # define ERROR (...) \ 2 printf (" file : %s, line : %d, error : ", ) \ 3 FILE, LINE, VA_ARGS ) 1 int main ( void ) { 2 ERROR (" Dies ist Fehler Nr %d", 100) ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 10/83

Der #-Operatror Wandelt einen Makroparameter in einen String um Darf nur innerhalb eines Makros verwendet werden Es ist jedoch nicht möglich den #-Operator auf einen Token anzuwenden 1 # define TOSTRING (a) #a 2 # define SOGEHTESNICHT # fehler 3... 4 cout << TOSTRING ( test string ) << endl // korrekt 5 cout << SOGEHTESNICHT << endl // fehler Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 11/83

Der ##-Operator Operator zu Konkatenation von 2 Token Darf ebenso nur in Makros verwendet werden Macht die Horizontale Iteration möglich. (zur Horizontalen Iteration später mehr) Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 12/83

Der ##-Operator Operator zu Konkatenation von 2 Token Darf ebenso nur in Makros verwendet werden Macht die Horizontale Iteration möglich. (zur Horizontalen Iteration später mehr) Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 12/83

Der ##-Operator Operator zu Konkatenation von 2 Token Darf ebenso nur in Makros verwendet werden Macht die Horizontale Iteration möglich. (zur Horizontalen Iteration später mehr) Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 12/83

Verschachtelte Makros Makros lassen sich beliebig verschachteln Es muss darauf geachtet werden, dass nur von oben nach unten verschachtelt werden kann Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 13/83

Verschachtelte Makros Makros lassen sich beliebig verschachteln Es muss darauf geachtet werden, dass nur von oben nach unten verschachtelt werden kann Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 13/83

Baumstruktur des Makros Baumstruktur Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 14/83

Primitive horizontale Iteration Dient dazu bestimmten Code zu expandieren Ist ein recht unflexiebles, dafür simples Konzept Die gesamte Expansion geschieht einzeilig, daher der der Begriff Horizontale Expansion Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 15/83

Primitive horizontale Iteration Dient dazu bestimmten Code zu expandieren Ist ein recht unflexiebles, dafür simples Konzept Die gesamte Expansion geschieht einzeilig, daher der der Begriff Horizontale Expansion Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 15/83

Primitive horizontale Iteration Dient dazu bestimmten Code zu expandieren Ist ein recht unflexiebles, dafür simples Konzept Die gesamte Expansion geschieht einzeilig, daher der der Begriff Horizontale Expansion Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 15/83

Horizontale Iteration Bringt die einfache horizontale Iteration auf ein höheres Level der Allgemeingültigkeit Die Idee ist ein Makro an einen allgemeinen Iterationsprozess zu bergeben Strebt nach dem Konzept der Wiederverwendbarkeit von Code Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 16/83

Horizontale Iteration Bringt die einfache horizontale Iteration auf ein höheres Level der Allgemeingültigkeit Die Idee ist ein Makro an einen allgemeinen Iterationsprozess zu bergeben Strebt nach dem Konzept der Wiederverwendbarkeit von Code Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 16/83

Horizontale Iteration Bringt die einfache horizontale Iteration auf ein höheres Level der Allgemeingültigkeit Die Idee ist ein Makro an einen allgemeinen Iterationsprozess zu bergeben Strebt nach dem Konzept der Wiederverwendbarkeit von Code Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 16/83

Lokale Iteration Ist ein Konzept um die enzeilige Expansion der vorherigen Kozepte zu umgehen Das Prinzip beruht auf der Auslagerung der Iterationsschritte, welche mit #if #endif definiert sind und auf unterschiedlichen Zeilen liegen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 17/83

Lokale Iteration Ist ein Konzept um die enzeilige Expansion der vorherigen Kozepte zu umgehen Das Prinzip beruht auf der Auslagerung der Iterationsschritte, welche mit #if #endif definiert sind und auf unterschiedlichen Zeilen liegen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 17/83

Datei Iteration & Selbst Iteration Die Datei Iteration unterscheidet sich zur lokalen Iteration ansich nur dadurch, dass kein Makro expandiert wird, sondern in jedem Iterationsschritt eine Datei inkludiert wird Die Selbst Iteration lässt sich als Variante der Datei Iteration verstehen. Dabei befindet sich der Code nicht in einer zusätzlichen Datei, sondern innerhalb der Datei, in der die Iteration initialisiert wird. Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 18/83

Datei Iteration & Selbst Iteration Die Datei Iteration unterscheidet sich zur lokalen Iteration ansich nur dadurch, dass kein Makro expandiert wird, sondern in jedem Iterationsschritt eine Datei inkludiert wird Die Selbst Iteration lässt sich als Variante der Datei Iteration verstehen. Dabei befindet sich der Code nicht in einer zusätzlichen Datei, sondern innerhalb der Datei, in der die Iteration initialisiert wird. Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 18/83

Inhalt 1 Metaprogrammierung mit dem Präprozessor 2 Templates Einleitung Parameter und Typen Abhängige Namen Benutzung Explizite Spezialisierung Partielle Spezialisierung Beispiele 3 Code Bloat Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 19/83

Template Einleitung Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 20/83

Ein Template ist eine Mustervorlage Semantisch gleichartige Funktionen/Klassen mit Verschiedenen Parametertypen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 21/83

Beispiel: Funktion, die einen int Parameter ausgibt 1 void printdata ( int value ) { 2 std :: cout << " The value is: " << value << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 22/83

Beispiel: Funktion, die einen double Parameter ausgibt 1 void printdata ( double value ) { 2 std :: cout << " The value is: " << value << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 23/83

Lösung: Template 1 template < typename T > 2 void printdata ( T value ) { 3 std :: cout << " The value is: " << value << std :: endl ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 24/83

Beispiel 1 int i = 3; 2 double d = 4. 75; 3 std :: string s(" Hallo "); 4 bool b = false ; 5 printdata (i); // The value is: 3 6 printdata (d); // The value is: 4.75 7 printdata ( s); // The value is: Hallo 8 printdata ( b); // The value is: false Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 25/83

Parameter und Typen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 26/83

Definition Beginnt mit dem Schlüsselwort template, hiernach folgt eine Liste von Template Parametern Darauf folgt eine Funktions- oder Klassen-Definition Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 27/83

Parameter Typen Werte Template 1 template < typename T > 2 function (...) {...} Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 28/83

Template Type Parameter Templates, die sich auf einen Type beziehen 1 template < typename T1 > 2 class MyClass {...}; 1 template < class T1 > 2 class MyClass {...}; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 29/83

Template Type Parameter 1 template < typename T > 2 void func ( T value ) { 3 const T& ref = value ; 4 T* p = new T; 5 T temp (23) ; 6 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 30/83

Generierter Code für func<int>: 1 void func ( int value ) { 2 const int & ref = value ; 3 int * p = new int ; 4 int temp (23) ; 5 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 31/83

Template Non-Type Parameter Parameter sind compile-time constants Syntax ähnlich einer Variablen-Deklaration Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 32/83

Template Non-Type Parameter 1 template < int i> 2 class A {...}; 1 template < double * dp > 2 class B {...}; 1 template < void (* func )( int )> 2 void c() {...} Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 33/83

Template Non-Type Parameter 1 A <3 > a3; 1 A< sizeof ( std :: string )> as; 1 double d; 2 B <&d> bpd ; 3 B<NULL > bn; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 34/83

Template Non-Type Parameter 1 void myfunc ( int i); 2 struct MyClass { 3 static void staticfunc ( int i); 4 }; 1 int main ( void ) { 2 c <& myfunc >() ; 3 c <& MyClass :: staticfunc >() ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 35/83

Template Template Parameter Ermöglicht einem Template ein anderes Template als Parameter hinzuzufügen Eine Klasse, die mehrere collections enthält, bietet dem Nutzer die Möglichkeit, den Type der collection zu bestimmen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 36/83

Template Template Parameter 1 template < template < typename T > class ContainerType > 2 class MyClass { 3 ContainerType < int > intcontainer ; 4 ContainerType < std :: string > stringcontainer ; 5... 6 }; 1 MyClass < vector > v; 2 MyClass <list > l; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 37/83

Default Template Parameter Genau wie Funktionen können auch Template default Parameter haben Wenn ein Template einen default Parameter hat, müssen alle nachfolgenden Parameter auch default Werte haben Bei der Referenzierung können die Parameter weggelassen werden Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 38/83

Default Template Parameter 1 template < typename T1, typename T2 = int, int i = 23 > 2 class MyClass {}; 1 MyClass < double, std :: string, 46 > mc1 ; // Alle Parameter spezifiziert 2 MyClass < std :: string, double > mc2 ; // i weggelasssen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 39/83

Default Template Parameter 1 template < typename T1, typename T2 = int, int i = 23 > 2 class MyClass {}; 1 MyClass < std :: string, double, 23 > mc3 ; // Normal 2 MyClass < int > mc4 ; // alle default 3 MyClass < int, int, 0 > mc5 ; // T2 muss spezifiert werden, wenn wir i spezifieren Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 40/83

Abhängige Namen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 41/83

Abhängig Namen sind jegliche Namen in der Template Definition, die von einem Template Parameter abhängen Werden nur bei der Initialisierung aufgelöst Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 42/83

1 struct X { 2 int x; 3 typedef double Z; 4 }; 5 struct Y { 6 typedef int x; 7 double Z; 8 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 43/83

1 template < typename T > 2 struct ZZ { 3 T::Z z1; // Falsch 4 typename T::Z z2; // OK 5 6 void func (T& t) { 7 t. x = 4; // OK, referenziert ein Objekt 8 } 9 10 typedef typename std :: vector <T >:: iterator VecIt ; // OK 11 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 44/83

1 int main () { 2 X x; 3 Y y; 4 5 ZZ <X> zzx ; // OK, X::Z ist ein Typ 6 ZZ <Y > zzy ; // Falsch, Y:: Z ist ein Objekt 7 8 zzx. func (x); // OK, X::x ist ein Objekt 9 zzy. func (y); // Falsch, Y::x ist ein Typ 10 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 45/83

Benutzung von Templates Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 46/83

1 template < typename T, unsigned i > 2 struct FixedArray { 3 T data [i]; 4 }; 1 FixedArray < int, 3 > a; // Array vom Typ int mit 3 Elementen 2 FixedArray < int, 1+6/3 > // Array vom Typ int mit 3 Elementen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 47/83

1 template < typename T, unsigned i > 2 struct FixedArray { 3 T data [i]; 4 }; 1 FixedArray < int, 3 > a; // Array vom Typ int mit 3 Elementen 2 FixedArray < int, 1+6/3 > // Array vom Typ int mit 3 Elementen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 47/83

1 template < template < typename T, typename Allocator > class Container > 2 struct ContainerPair { 3 Container <int, std :: allocator <int > > intcontainer ; 4 Container < std :: string, std :: allocator < std :: string > > stringcontainer ; 5 }; 1 ContainerPair < std :: deque > deqcont ; // zwei std :: deques 2 ContainerPair < std :: vector > veccont ; // zwei std :: vectors Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 48/83

1 template < template < typename T, typename Allocator > class Container > 2 struct ContainerPair { 3 Container <int, std :: allocator <int > > intcontainer ; 4 Container < std :: string, std :: allocator < std :: string > > stringcontainer ; 5 }; 1 ContainerPair < std :: deque > deqcont ; // zwei std :: deques 2 ContainerPair < std :: vector > veccont ; // zwei std :: vectors Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 48/83

Spezifikation der Template Parameter 1 template < typename T > 2 void func () {...} 1 int main ( void ) { 2 func <int >() ; 3 func < double >() ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 49/83

Spezifikation der Template Parameter 1 template < typename T > 2 void func () {...} 1 int main ( void ) { 2 func <int >() ; 3 func < double >() ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 49/83

Automatische Template Argument Erkennung 1 template < typename T > 2 void func (T val ) {} 3 4 template < typename T, typename U > 5 void func2 ( U val ) { 6 return T( val ); 7 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 50/83

Automatische Template Argument Erkennung 1 int main ( void ) { 2 // T= int 3 func (3) ; 4 // T= double 5 func (3.5) 6 7 // T=int, U= double 8 func2 <int >(3.5) ; 9 // T= std :: vector < std :: string >, U= int 10 func2 < std :: vector < std :: string > >(5); 11 // T und U spezifiziert ; T = std :: vector < std :: string >, U= int 12 func2 < std ::: vector < std :: string >, int >(5.7) ; 13 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 51/83

Explizite Spezialisierung Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 52/83

Templates können nicht einfach überladen werden Problematisch bei allgemein gehaltenen Templates 1 template < typename T > 2 void func ( T value ) { 3 value. add (3) ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 53/83

1 class T1 { 2 public : 3 void add ( int i, double d = 0. 0) ; 4 } 5 class T2 { 6 public : 7 std :: string add ( double d); 8 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 54/83

1 class T3 { 2 public : 3 void Add ( int i); 4 } Template func nicht nutzbar für T3 Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 55/83

Lösung: Explizite Spezialisierung für T3 1 template <> 2 void func <T3 >( T3 value ) { 3 value. Add (3) ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 56/83

Unterschiede zur normalen Template Deklaration leere Template Parameter Liste spezialisierte Template Parameter Liste nach dem Funktionsnamen Compiler Template ist spezialisiert Welche Parameter zu der Spezialisierung gehören Kann für Klasssen- und Funktionstemplates verwendet werden Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 57/83

1 template < typename T > 2 class X { 3 X(T x); 4 }; 5... 6 template < > 7 classx < std :: string > { 8 X( const std :: string & s); 9 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 58/83

Rekursive Klassen Templates 1 template < unsigned i > 2 struct Fibonacci { 3 static const unsigned result = Fibonacci <i -1 >:: result + Fibonacci <i -2 >:: result ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 59/83

Rekursive Klassen Templates 1 template < > 2 struct Fibonacci <0 > { 3 static const unsigned result = 1; 4 }; 5 template < > 6 struct Fibonacci <1 > { 7 static const unsigned result = 1; 8 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 60/83

Rekursive Klassen Templates 1 int main ( void ) { 2 std :: cout << Fibonacci <5 >:: result << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 61/83

Partielle Spezialisierung Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 62/83

Erlaubt es, ein Template für einen Teil der Parameter zu spezialisieren 1 template < typename T, typename U > 2 struct SameType { 3 static const bool result = false ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 63/83

1 template < typename T, typename U > 2 struct SameType { 3 static const bool result = false ; 4 }; 1 template < typename T > 2 struct SameType <T, T > { 3 static const bool result = true ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 64/83

1 template < typename T, typename U > 2 struct SameType { 3 static const bool result = false ; 4 }; 1 template < typename T > 2 struct SameType <T, T > { 3 static const bool result = true ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 64/83

1 int main ( void ) { 2 std :: cout << "Is int of the same type as double?" << () SameType <int, double >:: result? " Yes " : "No") << std :: endl ; 3 std :: cout << "Is double of the same type as double?" << () SameType < double, double >:: result? " Yes " : "No") << std :: endl ; 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 65/83

1 template < typename T > 2 struct IsConst { 3 static const bool result = false ; 4 }; 1 template < typename T > 2 struct IsConst < const T > { 3 static const bool result = true ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 66/83

1 template < typename T > 2 struct IsConst { 3 static const bool result = false ; 4 }; 1 template < typename T > 2 struct IsConst < const T > { 3 static const bool result = true ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 66/83

1 template < typename T > 2 struct IsVector { 3 static const bool result = false ; 4 }; 1 template < typename T > 2 struct IsVector < std :: vector <T > > { 3 static const bool result = true ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 67/83

1 template < typename T > 2 struct IsVector { 3 static const bool result = false ; 4 }; 1 template < typename T > 2 struct IsVector < std :: vector <T > > { 3 static const bool result = true ; 4 }; Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 67/83

Funktions Template Überladung Es ist nicht möglich, Funktions Templates partiell zu spezialisieren Man kann aber Funktions Templates überladen Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 68/83

Funktions Template Überladung 1 template < typename T > 2 void swap (T& lhs, T& rhs ) { 3 T temp ( lhs ); 4 lhs = rhs ; 5 rhs = temp ; 6 } Performance Nachteil bei großen Objekten Es wird ein neues Objekt erstellt und 3x kopiert Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 69/83

Funktions Template Überladung 1 template < typename T > 2 void swap (T& lhs, T& rhs ) { 3 T temp ( lhs ); 4 lhs = rhs ; 5 rhs = temp ; 6 } Performance Nachteil bei großen Objekten Es wird ein neues Objekt erstellt und 3x kopiert Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 69/83

Funktions Template Überladung 1 class ExpensiveToCopy { 2 public : 3 void swap ( ExpensiveToCopy & other ); 4 }; 1 template < > 2 void swap < ExpensiveToCopy >( ExpensiveToCopy & lhs, ExpensiveToCopy & rhs ) { 3 lhs. swap ( rhs ); 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 70/83

Funktions Template Überladung 1 class ExpensiveToCopy { 2 public : 3 void swap ( ExpensiveToCopy & other ); 4 }; 1 template < > 2 void swap < ExpensiveToCopy >( ExpensiveToCopy & lhs, ExpensiveToCopy & rhs ) { 3 lhs. swap ( rhs ); 4 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 70/83

Beispiele Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 71/83

1 int factorial ( int n) { 2 return ( n ==0)? 1 : n * factorial ( n -1) ; 3 } 1 int main () { 2 std :: cout << factorial ( 15) << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 72/83

1 int factorial ( int n) { 2 return ( n ==0)? 1 : n * factorial ( n -1) ; 3 } 1 int main () { 2 std :: cout << factorial ( 15) << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 72/83

1 template < int N> 2 struct Factorial { 3 enum { value = N * Factorial <N -1 >:: value }; 4 }; 5 template < > 6 Factorial <1 > { 7 enum { value = 1 }; 8 }; 1 int main () { 2 std :: cout << Factorial <15 >:: value << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 73/83

1 template < int N> 2 struct Factorial { 3 enum { value = N * Factorial <N -1 >:: value }; 4 }; 5 template < > 6 Factorial <1 > { 7 enum { value = 1 }; 8 }; 1 int main () { 2 std :: cout << Factorial <15 >:: value << std :: endl ; 3 } Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 73/83

Inhalt 1 Metaprogrammierung mit dem Präprozessor 2 Templates Einleitung Parameter und Typen Abhängige Namen Benutzung Explizite Spezialisierung Partielle Spezialisierung Beispiele 3 Code Bloat Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 74/83

In C++ wird das dynamic dispatching für Template Funktionen nicht direkt unterstützt Generische Algorithmen müssen zur Compile-Zeit für jeden Typ das Template instanziieren Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 75/83

Das führt zu sogenanntem code bloat bzw. template bloat code bloat ist bei dem Design von generischen Bibliotheken ein großes Thema Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 76/83

Ein Verfahren, dass versucht, code bloat bei Templates in den Griff zu bekommen ist template hoisting Beim template hoisting wird ein Template in eine generische Basis Klasse und nicht generische Kind Klassen aufgeteilt Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 77/83

Ein weiteres Verfahren ist, für verschiedene Algorithmen Typen zu vereinheitlichen type reduction Die Vereinheitlichung gilt dann NUR für diesen Algorithmus Beispiel: Ein RGB-Bild soll in ein BGR-Bild kopiert werden Das BGR Bild wird durch um-mapping der Farbkanäle in ein Pseudo-RGB Bild konvertiert Somit muss nur noch die Kopierfunktion für RGB RGB geschrieben werden Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 78/83

Bei solchen Techniken ist Vorsicht geboten, da sie häufig aus unsicheren casts aufbauen Zu Beachten ist, dass unterschiedliche Algorithmen unterschiedliche Vereinheitlichungen erlauben Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 79/83

Durch dieses Verfahren wird der Laufzeit-Nachteil in einen Compile-Zeit Nachteil umfunktioniert Der Code wird kleiner, die Compile-Zeit größer Generell entstehen bei exzessiver Template Programmierung oftmals viele Instanz mit ähnlichem bis fast vollständig identischem Code Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 80/83

Quellen C++ Metaprogrammierung - Sebastion Otte - Fachhochsule Wiesbaden Introduction to C++ Templates - Anthony Williams Efficient Run-Time Dispatching in Generic Programming with Minimal Code Bloat - Lubomir Bourdev & Jaakko Järvi Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 81/83

Fragen? Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 82/83

Vielen Dank für Ihre Aufmerksamkeit! Metaprogrammierung in C/C++ Philipp Bandow, Jakob Kasicz, Orhan Aykac 83/83