Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Introduction à
la metapro-
grammation
Florian
Galinier
Metaquoi ?
Introduction trop
abstraite
Un exemple plus
parlant
Allo...
Prochain SlideShare
Chargement dans…5
×

Introduction à la metaprogrammation en C++

674 vues

Publié le

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

Publié dans : Logiciels
  • DOWNLOAD THAT BOOKS INTO AVAILABLE FORMAT (2019 Update) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... ......................................................................................................................... ................................................................................................................................... eBook is an electronic version of a traditional print book that can be read by using a personal computer or by using an eBook reader. (An eBook reader can be a software application for use on a computer such as Microsoft's free Reader application, or a book-sized computer that is used solely as a reading device such as Nuvomedia's Rocket eBook.) Users can purchase an eBook on diskette or CD, but the most popular method of getting an eBook is to purchase a downloadable file of the eBook (or other reading material) from a Web site (such as Barnes and Noble) to be read from the user's computer or reading device. Generally, an eBook can be downloaded in five minutes or less ......................................................................................................................... .............. Browse by Genre Available eBooks .............................................................................................................................. Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, ......................................................................................................................... ......................................................................................................................... .....BEST SELLER FOR EBOOK RECOMMEND............................................................. ......................................................................................................................... Blowout: Corrupted Democracy, Rogue State Russia, and the Richest, Most Destructive Industry on Earth,-- The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company,-- Call Sign Chaos: Learning to Lead,-- StrengthsFinder 2.0,-- Stillness Is the Key,-- She Said: Breaking the Sexual Harassment Story That Helped Ignite a Movement,-- Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones,-- Everything Is Figureoutable,-- What It Takes: Lessons in the Pursuit of Excellence,-- Rich Dad Poor Dad: What the Rich Teach Their Kids About Money That the Poor and Middle Class Do Not!,-- The Total Money Makeover: Classic Edition: A Proven Plan for Financial Fitness,-- Shut Up and Listen!: Hard Business Truths that Will Help You Succeed, ......................................................................................................................... .........................................................................................................................
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • DOWNLOAD THAT BOOKS INTO AVAILABLE FORMAT (2019 Update) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download doc Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... ......................................................................................................................... ................................................................................................................................... eBook is an electronic version of a traditional print book that can be read by using a personal computer or by using an eBook reader. (An eBook reader can be a software application for use on a computer such as Microsoft's free Reader application, or a book-sized computer that is used solely as a reading device such as Nuvomedia's Rocket eBook.) Users can purchase an eBook on diskette or CD, but the most popular method of getting an eBook is to purchase a downloadable file of the eBook (or other reading material) from a Web site (such as Barnes and Noble) to be read from the user's computer or reading device. Generally, an eBook can be downloaded in five minutes or less ......................................................................................................................... .............. Browse by Genre Available eBooks .............................................................................................................................. Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, ......................................................................................................................... ......................................................................................................................... .....BEST SELLER FOR EBOOK RECOMMEND............................................................. ......................................................................................................................... Blowout: Corrupted Democracy, Rogue State Russia, and the Richest, Most Destructive Industry on Earth,-- The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company,-- Call Sign Chaos: Learning to Lead,-- StrengthsFinder 2.0,-- Stillness Is the Key,-- She Said: Breaking the Sexual Harassment Story That Helped Ignite a Movement,-- Atomic Habits: An Easy & Proven Way to Build Good Habits & Break Bad Ones,-- Everything Is Figureoutable,-- What It Takes: Lessons in the Pursuit of Excellence,-- Rich Dad Poor Dad: What the Rich Teach Their Kids About Money That the Poor and Middle Class Do Not!,-- The Total Money Makeover: Classic Edition: A Proven Plan for Financial Fitness,-- Shut Up and Listen!: Hard Business Truths that Will Help You Succeed, ......................................................................................................................... .........................................................................................................................
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

Introduction à la metaprogrammation en C++

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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); }

×