Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Quelques notions de méta-programmation en C++

357 views

Published on

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.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Quelques notions de méta-programmation en C++

  1. 1. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Quelques notions de méta-programmation en C++ Florian Galinier 24 novembre 2015
  2. 2. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Cette écriture abstraite : template <typename T> void f(T i) { std ::cout <<i<<std:: endl; }
  3. 3. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant 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; } ...
  4. 4. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion (defun fibo (n) (if (or (= n 0) (= n 1)) 1.0 (+ (fibo (- n 1)) (fibo (- n 2))) ) )
  5. 5. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion template <int N> struct Fibo { static const long value = Fibo <N-1 >:: value + Fibo <N-2 >:: value; }; template <> struct Fibo <0>{ static const long value = 1; }; template <> struct Fibo <1> { static const long value = 1; };
  6. 6. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Pour quoi faire ? interface B { // ... } public class A<T extends B> { // ... }
  7. 7. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Comment faire en C++ ? interface B { // ... } public class A<T extends B> { // ... } ↓ class B { // ... }; template <class T> class A { static_assert (std:: is_base_of <B,T >:: value ,"Template parameter must be a subtype of B"); // ... };
  8. 8. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Pour quoi faire ? int main () { // Avec C sous -type de B A<B> b; // -> Ok A<C> c; // -> Ok A<D> d; // -> error: static assertion failed: Template parameter must be a subtype of B }
  9. 9. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Autre utilisation possible template <class T> class A { T a; void save () { if(std :: is_pointer <T >:: value) a->save (); else a.save (); } };
  10. 10. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Autre utilisation possible template <class T> class A { T a; void save () { if(std :: is_pointer <T >:: value) a->save (); else a.save (); } }; Ne compile pas
  11. 11. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Solution template <typename T, T val > struct integral_constant { // ... }; typedef integral_constant <bool , true > true_type; typedef integral_constant <bool , false > false_type;
  12. 12. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion Solution template <class T> class A { T a; void save(std :: true_type) {a->save ();} void save(std :: false_type) {a.save ();} void save () { this ->save(std:: integral_constant <bool ,std :: is_pointer <T >:: value >()); } };
  13. 13. Quelques notions de méta- programmation en C++ Florian Galinier Petits rappels Méta- programmation Spécialisation et récursion Assertion statique integral_constant Conclusion La méta-programmation en C++ c’est : • avec les templates... • ... et donc à la compilation ; • #include <type_traits> • bien plus encore !

×