Cette présentation a pour but de présenter quelques notions de base des templates C++ dans le but de faire de la metaprogrammation. Au programme : spécialisation, récursion, template variadique et un exemple de polymorphisme statique.
Une autre présentation devrait permettre d'approfondir un peu.
Cette présentation a été donnée lors des Rencontres C++ à Montpellier le 16/12/14.
http://fgalinier.fr/index.html
Quelques notions de méta-programmation en C++galinierf
Cette présentation fait suite à celle d'introduction à la méta-programmation avec templates de C++ (http://fr.slideshare.net/galinierf/introduction-la-metaprogrammation-en-c).
J'ai présenté quelques notions un peu plus avancé dans le but de démontrer que plus qu'un gadget rigolo, la méta-programmation peut vraiment être utile, notamment lors de l'écriture de bibliothèques génériques.
Cette présentation a été donnée lors des Rencontres C++ à Montpellier le 24/11/12.
Notions de base de programmation en langage C, le syntaxe, les opérateurs, l'affichage et le saisie, les structures de contrôle, les boucles.
cours par Benouini Rachid.
Quelques notions de méta-programmation en C++galinierf
Cette présentation fait suite à celle d'introduction à la méta-programmation avec templates de C++ (http://fr.slideshare.net/galinierf/introduction-la-metaprogrammation-en-c).
J'ai présenté quelques notions un peu plus avancé dans le but de démontrer que plus qu'un gadget rigolo, la méta-programmation peut vraiment être utile, notamment lors de l'écriture de bibliothèques génériques.
Cette présentation a été donnée lors des Rencontres C++ à Montpellier le 24/11/12.
Notions de base de programmation en langage C, le syntaxe, les opérateurs, l'affichage et le saisie, les structures de contrôle, les boucles.
cours par Benouini Rachid.
C'est le premier chapitre du cours en C++ de la programmation procédurale à la POO.
Partie 1: La Programmation Procédurale.
Partie 2: La Programmation Orientée Objet.
Partie 3: Les Exceptions, Entrées/Sorties, Structures, Unions, Énumérations…
Partie 4: Les interfaces Graphiques avec Qt.
C'est la version 2019 du chapitre 1 sur C++:
https://fr.slideshare.net/AzizDarouichi/chap1-cours-en-c
Si vous avez des remarques ou des suggestions afin d'améliorer ce support du cours merci de me contacter via pr.azizdarouichi@gmail.com
Bonne lecture
Flutter : communication Android/iOS et les packagesEdouard Marquez
A l'occasion de la première édition du meetup Flutter Paris, trois sessions ont été données : une introduction à Flutter, un livecode d'une application et enfin une présentation.
Dans cette dernière, la manière de communiquer avec les plateformes spécifiques (Android ou iOS) est expliquée : comment récupérer un résultat généré côté Java/Kotlin ou Objective C/Swift et le recevoir dans la partie Dart/Flutter ?
La seconde partie de la présentation concerne les dépendances d'un projet, que l'on appelle packages et plugins en Flutter.
Enfin les derniers slides relatent l'avancement de la bêta de Flutter et notamment les fonctionnalités qui arriveront prochainement.
Articulé autour de C++ 11, cette session amène celui qui y assiste aux fondamentaux du développement logiciel : libraries, dépendances, TR1 et C++0X les fondations de C++ 11, runtime C alias CRT, runtime C++ alias STL, agilité en C++, ALM en C++, Windows 8 et C++, C++ et Windows 8 avec le nouveau modèle COM nommé WRL.
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Comme des millions de développeurs, vous utilisez C# quotidiennement … mais en maitrisez-vous les subtilités ? Cette session ludique vous plongera au cœur de votre langage de prédilection au travers programmes et exemples de code qui ne cesseront de vous surprendre. Avec en prime quelques (petits) lots à gagner pour les développeurs les plus perspicaces !
Cours en C++ de la programmation procédurale à la POO.
Partie 1: La Programmation Procédurale.
Partie 2: La Programmation Orientée Objet.
Partie 3: Les Exceptions, Entrées/Sorties, Structures, Unions, Énumérations…
Partie 4: Les interfaces Graphiques avec Qt.
Si vous avez des remarques ou des suggestions afin d'améliorer ce support du cours merci de me contacter via pr.azizdarouichi@gmail.com
Voici le chapitre sur les pointeurs et les références en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Voici le chapitre 6 sur les classes et les interfaces en Java.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
C'est le premier chapitre du cours en C++ de la programmation procédurale à la POO.
Partie 1: La Programmation Procédurale.
Partie 2: La Programmation Orientée Objet.
Partie 3: Les Exceptions, Entrées/Sorties, Structures, Unions, Énumérations…
Partie 4: Les interfaces Graphiques avec Qt.
C'est la version 2019 du chapitre 1 sur C++:
https://fr.slideshare.net/AzizDarouichi/chap1-cours-en-c
Si vous avez des remarques ou des suggestions afin d'améliorer ce support du cours merci de me contacter via pr.azizdarouichi@gmail.com
Bonne lecture
Flutter : communication Android/iOS et les packagesEdouard Marquez
A l'occasion de la première édition du meetup Flutter Paris, trois sessions ont été données : une introduction à Flutter, un livecode d'une application et enfin une présentation.
Dans cette dernière, la manière de communiquer avec les plateformes spécifiques (Android ou iOS) est expliquée : comment récupérer un résultat généré côté Java/Kotlin ou Objective C/Swift et le recevoir dans la partie Dart/Flutter ?
La seconde partie de la présentation concerne les dépendances d'un projet, que l'on appelle packages et plugins en Flutter.
Enfin les derniers slides relatent l'avancement de la bêta de Flutter et notamment les fonctionnalités qui arriveront prochainement.
Articulé autour de C++ 11, cette session amène celui qui y assiste aux fondamentaux du développement logiciel : libraries, dépendances, TR1 et C++0X les fondations de C++ 11, runtime C alias CRT, runtime C++ alias STL, agilité en C++, ALM en C++, Windows 8 et C++, C++ et Windows 8 avec le nouveau modèle COM nommé WRL.
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Comme des millions de développeurs, vous utilisez C# quotidiennement … mais en maitrisez-vous les subtilités ? Cette session ludique vous plongera au cœur de votre langage de prédilection au travers programmes et exemples de code qui ne cesseront de vous surprendre. Avec en prime quelques (petits) lots à gagner pour les développeurs les plus perspicaces !
Cours en C++ de la programmation procédurale à la POO.
Partie 1: La Programmation Procédurale.
Partie 2: La Programmation Orientée Objet.
Partie 3: Les Exceptions, Entrées/Sorties, Structures, Unions, Énumérations…
Partie 4: Les interfaces Graphiques avec Qt.
Si vous avez des remarques ou des suggestions afin d'améliorer ce support du cours merci de me contacter via pr.azizdarouichi@gmail.com
Voici le chapitre sur les pointeurs et les références en C++.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Voici le chapitre 6 sur les classes et les interfaces en Java.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Le projet LLVM est surtout connu pour son compilateur C/C++/ObjC : clang. LLVM offre cependant beaucoup plus qu'un compilateur. Cette présentation sera une brève introduction aux différents outils disponibles pour la programmation en C++: indexation, formatage, analyse statique, annotations, réécriture de code source, ...
Cours d'introduction à C++ pour un public connaissant le langage C et ayant des bases en algorithmique, mais n'ayant pas de connaissance particulière sur les objets
Créer et gérer un site internet seul c'est possibleYoucef Kébaïli
L'agence Web CLENO vous montre comment créer vous-même votre Site Internet avec l'outil Jimdo.
Suivez la démonstration et faites un essai gratuit en ligne.
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);
}