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
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;
}
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;
}
...
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)))
)
)
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;
};
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> {
// ...
}
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");
// ...
};
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
}
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 ();
}
};
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
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;
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 >());
}
};
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 !

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