SlideShare ist ein Scribd-Unternehmen logo
1 von 28
Downloaden Sie, um offline zu lesen
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Introduction à la metaprogrammation
Florian Galinier
16 décembre 2014
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
• Du grec µετ ´α (après, au-delà de)
• Metalangage : Langage qui permet de décrire un autre
langage, moins abstrait.
• Rendu possible grâce à C++98 et aux templates
• Développé grâce à C++11
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Cette écriture abstraite :
template <typename T>
void f(T i) {
std ::cout <<i<<std:: endl;
}
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Correspond à cette écriture concrète :
void f(int i) {
std ::cout <<i<<std:: endl;
}
void f(float i) {
std ::cout <<i<<std:: endl;
}
void f(char i) {
std ::cout <<i<<std:: endl;
}
...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Prenons un exemple un peu plus concret :
template <typename T>
T my_max(T i,T j) {
return i>=j?i:j;
}
Et pour std::string ?
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
string i = "ada";
string j = "c";
cout <<
my_max(i,j)
<<endl;
Et sa sortie :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
c
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
template <>
string my_max(string i,string j) {
return i.size ()==j.size ()?
(i>j?i:j):
(i.size()>j.size ()?i:j);
}
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
string i = "ada";
string j = "c";
cout <<
my_max(i,j)
<<endl;
Et sa sortie :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
ada
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
template <typename T,typename F>
struct is_same {
static const bool value = false;
};
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
string i = "ada";
cout <<
is_same <decltype(i),int >:: value
<<endl;
cout <<
is_same <decltype(i),string >:: value
<<endl;
Donnera :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
0
0
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
template <typename T>
struct is_same <T,T> {
static const bool value = true;
};
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
string i = "ada";
cout <<
is_same <decltype(i),int >:: value
<<endl;
cout <<
is_same <decltype(i),string >:: value
<<endl;
Donnera :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
0
1
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Petite devinette
A *b = new B();
cout <<
is_same <decltype (*b),B&>:: value
<<endl;
Que va-t-il afficher ?
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Réponse
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
0
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
(defun my_pow (x n)
(if (= n 0)
1.0
(* x (my_pow (x (- n 1))))))
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
template <int N>
float my_pow(float x) {
return x * my_pow <N - 1>(x);
}
template <>
float my_pow <0>( float x) {
return 1.0;
}
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
int main () {
float x = my_pow <3 >(3);
}
-> my_pow <3 >(3)
-> 3*my_pow <2 >(3)
-> 3*3* my_pow <1 >(3)
-> 3*3*3* my_pow <0 >(3)
-> 3*3*3*1
-> 27
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
struct empty_tlist {};
template <typename T,typename S>
struct tlist {
T first;
S tail;
};
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Avant C++11
tlist <int ,tlist <double ,tlist <float ,tlist <char ,empty_tlist > > > > t;
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
struct empty_tlist {};
template <typename T, typename ... S>
struct tlist {
T first;
tlist <S...> tail;
};
template <typename T>
struct tlist <T> {
T first;
};
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Depuis C++11
Sans variadique :
tlist <int ,tlist <double ,tlist <float ,tlist <char ,empty_tlist >>>> t;
Avec variadique :
tlist <int ,double ,float ,char ,empty_list > t;
Analysons
Avec les variadiques, nous avons la structure tlist qui est
initialisée avec les paramètres
< int, {double, float, char, empty_list} >, qui a pour tête un
int et pour queue une tlist paramétrée par
< double, float, char, empty_list >, qui est donc construite
selon les paramètres < double, {float, char, empty_list} >, etc.
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Que va afficher ce programme ?
class A {
public:
void foo() {
std::cout <<"A"<<std :: endl;
};
};
class B : virtual public A {
public:
void foo() {
std::cout <<"B"<<std :: endl;
};
};
int main () {
A* a = new B();
a->foo ();
}
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Réponse :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
A
Petite explication
L’héritage de foo étant statique, c’est le type statique de a qui
est pris en compte pour l’envoie de message foo.
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Que va afficher ce programme ?
class A {
public:
virtual void foo() {
std::cout <<"A"<<std :: endl;
};
};
class B : virtual public A {
public:
void foo() {
std::cout <<"B"<<std :: endl;
};
};
int main () {
A* a = new B();
a->foo ();
}
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Réponse :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
B
Petite explication
L’héritage de foo est maintenant déclaré comme virtual, c’est à
dire dynamique, c’est le type dynamique de a qui est donc pris
en compte pour l’envoie de message foo.
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Que va afficher ce programme ?
template <typename T>
class A_ {
public:
void foo() {
static_cast <T&>(* this ). foo ();
};
};
class A : public A_ <A> {
public:
void foo() {
std::cout <<"A"<<std :: endl;
};
};
class B : public A_ <B>, public A {
public:
void foo() {
std::cout <<"B"<<std :: endl;
};
};
int main () {
A_ <B> *a = new B();
a->foo ();
}
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
Réponse :
ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out
B
Petite explication
Comme lors de l’exemple préliminaire, c’est le type statique de
a qui est pris en compte, donc de type A_. Mais A_ :: foo()
appelle foo de T, le type qui paramétrise la classe A_, c’est à
dire B, qui est également le type dynamique de a.
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allons un peu
plus loin
La spécialisation
totale
La spécialisation
partielle
La récursion
Un ajout de
C++11 : Les
templates variadiques
Un problème
d’héritage
Petite question
préliminaire
Une solution à
l’exécution
Une solution à la
compilation
Conclusion
La metaprogrammation en C++ c’est :
• avec les templates ;
• Turing-complète ;
• bien plus encore...
template <typename ... T>
void print_loop(tlist <T...> l) {
cout <<l.first;
print_loop(l.tail );
};
template <>
void print_loop <empty_list >(tlist <empty_list > l) {
cout <<endl;
};
int main () {
tlist <char ,char ,char ,char ,char ,char ,char ,char ,empty_list >
j = {’M’,’E’,’T’,’A’,’-’,’C’,’+’,’+’ ,{}};
print_loop(j);
}

Weitere ähnliche Inhalte

Was ist angesagt?

Langage C
Langage  CLangage  C
Langage Cjwilili
 
Seance 1 - Programmation en langage C
Seance 1 - Programmation en langage CSeance 1 - Programmation en langage C
Seance 1 - Programmation en langage CFahad Golra
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Fahad Golra
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage CFahad Golra
 
Seance 2 - Programmation en langage C
Seance 2 - Programmation en langage CSeance 2 - Programmation en langage C
Seance 2 - Programmation en langage CFahad Golra
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Aziz Darouichi
 
Flutter : communication Android/iOS et les packages
Flutter : communication Android/iOS et les packagesFlutter : communication Android/iOS et les packages
Flutter : communication Android/iOS et les packagesEdouard Marquez
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...cppfrug
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simplesPethrvs
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage cEbrima NJIE
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Exercices en langage c
Exercices en langage cExercices en langage c
Exercices en langage cDaoua Lotfi
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Aziz Darouichi
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 

Was ist angesagt? (20)

Langage C
Langage  CLangage  C
Langage C
 
Seance 1 - Programmation en langage C
Seance 1 - Programmation en langage CSeance 1 - Programmation en langage C
Seance 1 - Programmation en langage C
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage C
 
Seance 2 - Programmation en langage C
Seance 2 - Programmation en langage CSeance 2 - Programmation en langage C
Seance 2 - Programmation en langage C
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
Flutter : communication Android/iOS et les packages
Flutter : communication Android/iOS et les packagesFlutter : communication Android/iOS et les packages
Flutter : communication Android/iOS et les packages
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte...
 
Le langage C
Le langage CLe langage C
Le langage C
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage c
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Exercices en langage c
Exercices en langage cExercices en langage c
Exercices en langage c
 
Carré Magique Cpp
Carré Magique CppCarré Magique Cpp
Carré Magique Cpp
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 
Theme2
Theme2Theme2
Theme2
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 

Andere mochten auch

Comment retrouver la forme récursive
Comment retrouver la forme récursiveComment retrouver la forme récursive
Comment retrouver la forme récursiveMariem ZAOUALI
 
LLVM, clang & c++
LLVM, clang & c++LLVM, clang & c++
LLVM, clang & c++cppfrug
 
Report on GPU complex type usage
Report on GPU complex type usageReport on GPU complex type usage
Report on GPU complex type usageCaner Candan
 
Exception Handling in C++
Exception Handling in C++Exception Handling in C++
Exception Handling in C++Deepak Tathe
 
Exception handling in c++ by manoj vasava
Exception handling in c++ by manoj vasavaException handling in c++ by manoj vasava
Exception handling in c++ by manoj vasavaManoj_vasava
 
4.0 projek pengaturcaraan
4.0 projek pengaturcaraan4.0 projek pengaturcaraan
4.0 projek pengaturcaraanSakinah Hassan
 
Principles and advantages of oop ppt
Principles and advantages of oop pptPrinciples and advantages of oop ppt
Principles and advantages of oop pptdaxesh chauhan
 
C++ vs C#
C++ vs C#C++ vs C#
C++ vs C#sudipv
 
Exception Handling
Exception HandlingException Handling
Exception HandlingReddhi Basu
 
Votado Co.
Votado Co.Votado Co.
Votado Co.Hugo
 
Powerpoint Web 2.0
Powerpoint Web 2.0Powerpoint Web 2.0
Powerpoint Web 2.0rebeca15
 
Diferencias Entre Web 2.0 Y Web 1.0
Diferencias Entre Web 2.0 Y Web 1.0Diferencias Entre Web 2.0 Y Web 1.0
Diferencias Entre Web 2.0 Y Web 1.0sapz77
 
Créer et gérer un site internet seul c'est possible
Créer et gérer un site internet seul c'est possibleCréer et gérer un site internet seul c'est possible
Créer et gérer un site internet seul c'est possibleYoucef Kébaïli
 
Presentaciones Anita Belen
Presentaciones Anita BelenPresentaciones Anita Belen
Presentaciones Anita Belenanita
 
Lecercle blue light_georgia
Lecercle blue light_georgiaLecercle blue light_georgia
Lecercle blue light_georgiaylebrec
 

Andere mochten auch (20)

Primitives
PrimitivesPrimitives
Primitives
 
Comment retrouver la forme récursive
Comment retrouver la forme récursiveComment retrouver la forme récursive
Comment retrouver la forme récursive
 
LLVM, clang & c++
LLVM, clang & c++LLVM, clang & c++
LLVM, clang & c++
 
openFrameworks
openFrameworksopenFrameworks
openFrameworks
 
Report on GPU complex type usage
Report on GPU complex type usageReport on GPU complex type usage
Report on GPU complex type usage
 
Introduction à C++
Introduction à C++Introduction à C++
Introduction à C++
 
Pengaturcaraan asas
Pengaturcaraan asasPengaturcaraan asas
Pengaturcaraan asas
 
Exception Handling in C++
Exception Handling in C++Exception Handling in C++
Exception Handling in C++
 
Exception handling in c++ by manoj vasava
Exception handling in c++ by manoj vasavaException handling in c++ by manoj vasava
Exception handling in c++ by manoj vasava
 
4.0 projek pengaturcaraan
4.0 projek pengaturcaraan4.0 projek pengaturcaraan
4.0 projek pengaturcaraan
 
Principles and advantages of oop ppt
Principles and advantages of oop pptPrinciples and advantages of oop ppt
Principles and advantages of oop ppt
 
C++ vs C#
C++ vs C#C++ vs C#
C++ vs C#
 
Exception Handling
Exception HandlingException Handling
Exception Handling
 
Votado Co.
Votado Co.Votado Co.
Votado Co.
 
Powerpoint Web 2.0
Powerpoint Web 2.0Powerpoint Web 2.0
Powerpoint Web 2.0
 
Diferencias Entre Web 2.0 Y Web 1.0
Diferencias Entre Web 2.0 Y Web 1.0Diferencias Entre Web 2.0 Y Web 1.0
Diferencias Entre Web 2.0 Y Web 1.0
 
Las Vocales
Las VocalesLas Vocales
Las Vocales
 
Créer et gérer un site internet seul c'est possible
Créer et gérer un site internet seul c'est possibleCréer et gérer un site internet seul c'est possible
Créer et gérer un site internet seul c'est possible
 
Presentaciones Anita Belen
Presentaciones Anita BelenPresentaciones Anita Belen
Presentaciones Anita Belen
 
Lecercle blue light_georgia
Lecercle blue light_georgiaLecercle blue light_georgia
Lecercle blue light_georgia
 

Introduction à la metaprogrammation en C++

  • 1. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Introduction à la metaprogrammation Florian Galinier 16 décembre 2014
  • 2. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion • Du grec µετ ´α (après, au-delà de) • Metalangage : Langage qui permet de décrire un autre langage, moins abstrait. • Rendu possible grâce à C++98 et aux templates • Développé grâce à C++11
  • 3. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Cette écriture abstraite : template <typename T> void f(T i) { std ::cout <<i<<std:: endl; }
  • 4. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Correspond à cette écriture concrète : void f(int i) { std ::cout <<i<<std:: endl; } void f(float i) { std ::cout <<i<<std:: endl; } void f(char i) { std ::cout <<i<<std:: endl; } ...
  • 5. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Prenons un exemple un peu plus concret : template <typename T> T my_max(T i,T j) { return i>=j?i:j; } Et pour std::string ?
  • 6. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion string i = "ada"; string j = "c"; cout << my_max(i,j) <<endl; Et sa sortie : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out c
  • 7. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion template <> string my_max(string i,string j) { return i.size ()==j.size ()? (i>j?i:j): (i.size()>j.size ()?i:j); }
  • 8. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion string i = "ada"; string j = "c"; cout << my_max(i,j) <<endl; Et sa sortie : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out ada
  • 9. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion template <typename T,typename F> struct is_same { static const bool value = false; };
  • 10. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion string i = "ada"; cout << is_same <decltype(i),int >:: value <<endl; cout << is_same <decltype(i),string >:: value <<endl; Donnera : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out 0 0
  • 11. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion template <typename T> struct is_same <T,T> { static const bool value = true; };
  • 12. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion string i = "ada"; cout << is_same <decltype(i),int >:: value <<endl; cout << is_same <decltype(i),string >:: value <<endl; Donnera : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out 0 1
  • 13. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Petite devinette A *b = new B(); cout << is_same <decltype (*b),B&>:: value <<endl; Que va-t-il afficher ?
  • 14. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Réponse ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out 0
  • 15. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion (defun my_pow (x n) (if (= n 0) 1.0 (* x (my_pow (x (- n 1))))))
  • 16. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion template <int N> float my_pow(float x) { return x * my_pow <N - 1>(x); } template <> float my_pow <0>( float x) { return 1.0; }
  • 17. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion int main () { float x = my_pow <3 >(3); } -> my_pow <3 >(3) -> 3*my_pow <2 >(3) -> 3*3* my_pow <1 >(3) -> 3*3*3* my_pow <0 >(3) -> 3*3*3*1 -> 27
  • 18. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion struct empty_tlist {}; template <typename T,typename S> struct tlist { T first; S tail; };
  • 19. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Avant C++11 tlist <int ,tlist <double ,tlist <float ,tlist <char ,empty_tlist > > > > t;
  • 20. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion struct empty_tlist {}; template <typename T, typename ... S> struct tlist { T first; tlist <S...> tail; }; template <typename T> struct tlist <T> { T first; };
  • 21. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Depuis C++11 Sans variadique : tlist <int ,tlist <double ,tlist <float ,tlist <char ,empty_tlist >>>> t; Avec variadique : tlist <int ,double ,float ,char ,empty_list > t; Analysons Avec les variadiques, nous avons la structure tlist qui est initialisée avec les paramètres < int, {double, float, char, empty_list} >, qui a pour tête un int et pour queue une tlist paramétrée par < double, float, char, empty_list >, qui est donc construite selon les paramètres < double, {float, char, empty_list} >, etc.
  • 22. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Que va afficher ce programme ? class A { public: void foo() { std::cout <<"A"<<std :: endl; }; }; class B : virtual public A { public: void foo() { std::cout <<"B"<<std :: endl; }; }; int main () { A* a = new B(); a->foo (); }
  • 23. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Réponse : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out A Petite explication L’héritage de foo étant statique, c’est le type statique de a qui est pris en compte pour l’envoie de message foo.
  • 24. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Que va afficher ce programme ? class A { public: virtual void foo() { std::cout <<"A"<<std :: endl; }; }; class B : virtual public A { public: void foo() { std::cout <<"B"<<std :: endl; }; }; int main () { A* a = new B(); a->foo (); }
  • 25. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Réponse : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out B Petite explication L’héritage de foo est maintenant déclaré comme virtual, c’est à dire dynamique, c’est le type dynamique de a qui est donc pris en compte pour l’envoie de message foo.
  • 26. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Que va afficher ce programme ? template <typename T> class A_ { public: void foo() { static_cast <T&>(* this ). foo (); }; }; class A : public A_ <A> { public: void foo() { std::cout <<"A"<<std :: endl; }; }; class B : public A_ <B>, public A { public: void foo() { std::cout <<"B"<<std :: endl; }; }; int main () { A_ <B> *a = new B(); a->foo (); }
  • 27. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion Réponse : ynigvi@ynigvi -desktop :~/ Meetup -C++/ metaprogrammation$ ./a.out B Petite explication Comme lors de l’exemple préliminaire, c’est le type statique de a qui est pris en compte, donc de type A_. Mais A_ :: foo() appelle foo de T, le type qui paramétrise la classe A_, c’est à dire B, qui est également le type dynamique de a.
  • 28. Introduction à la metapro- grammation Florian Galinier Metaquoi ? Introduction trop abstraite Un exemple plus parlant Allons un peu plus loin La spécialisation totale La spécialisation partielle La récursion Un ajout de C++11 : Les templates variadiques Un problème d’héritage Petite question préliminaire Une solution à l’exécution Une solution à la compilation Conclusion La metaprogrammation en C++ c’est : • avec les templates ; • Turing-complète ; • bien plus encore... template <typename ... T> void print_loop(tlist <T...> l) { cout <<l.first; print_loop(l.tail ); }; template <> void print_loop <empty_list >(tlist <empty_list > l) { cout <<endl; }; int main () { tlist <char ,char ,char ,char ,char ,char ,char ,char ,empty_list > j = {’M’,’E’,’T’,’A’,’-’,’C’,’+’,’+’ ,{}}; print_loop(j); }