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.
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. 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. 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. 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. 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. 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. 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 !