lang:cpp:templatespecialisation
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
lang:cpp:templatespecialisation [2021/04/21 13:19] – Ajout de "Empêcher l'utilisation du template non spécialisé" root | lang:cpp:templatespecialisation [2021/07/05 09:51] (Version actuelle) – Déplacement de Divers en bas root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====Divers==== | + | ====Spécialisation partielle==== |
- | ===Empêcher l' | + | ===Il faut commencer par spécialiser le premier |
- | '' | + | * Classe template |
<code cpp> | <code cpp> | ||
- | # | + | template<typename T> |
+ | class A | ||
+ | { | ||
+ | template< | ||
+ | class B | ||
+ | { | ||
+ | }; | ||
+ | }; | ||
- | template < | + | // OK |
- | struct foobar | + | template<> |
+ | template< | ||
+ | class A< | ||
+ | { | ||
+ | int b; | ||
+ | }; | ||
- | // Template général. | + | // KO |
- | template <class T> | + | template< |
- | T fun(T a) { | + | template<> |
- | | + | class A<T>::B< |
- | " | + | { |
- | } | + | int b; |
+ | }; | ||
- | template <> | ||
- | int fun(int a) { | ||
- | return a; | ||
- | } | ||
- | |||
- | int main() { | ||
- | // fun< | ||
- | fun< | ||
- | // fun< | ||
- | } | ||
</ | </ | ||
+ | * Fonction template | ||
+ | Il n'est pas possible de faire de la spécialisation partielle de template comme pour les classes. | ||
+ | Mais il est possible d' | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | |||
+ | struct I { | ||
+ | using R = int; | ||
+ | }; | ||
+ | |||
+ | struct F { | ||
+ | using R = float; | ||
+ | }; | ||
+ | |||
+ | class A { | ||
+ | | ||
+ | template < | ||
+ | static typename std:: | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | static typename std:: | ||
+ | return 27; | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | int main() { return A:: | ||
+ | </ | ||
====Décorateur==== | ====Décorateur==== | ||
Ligne 295: | Ligne 330: | ||
[[https:// | [[https:// | ||
+ | |||
+ | ====Divers==== | ||
+ | |||
+ | ===Empêcher l' | ||
+ | |||
+ | '' | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | |||
+ | template < | ||
+ | struct foobar : std:: | ||
+ | |||
+ | // Template général. | ||
+ | template <class T> | ||
+ | T fun(T a) { | ||
+ | // La variable value n'est évaluée que si la méthode est utilisée. | ||
+ | static_assert(foobar< | ||
+ | "this function has to be implemented for desired type" | ||
+ | } | ||
+ | |||
+ | template <> | ||
+ | int fun(int a) { | ||
+ | return a; | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | // fun< | ||
+ | fun< | ||
+ | // fun< | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Autre exemple avec '' | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | |||
+ | struct A | ||
+ | { | ||
+ | using Ty = int; | ||
+ | }; | ||
+ | |||
+ | struct B {}; | ||
+ | |||
+ | // KO, should be OK. | ||
+ | // using Ttrue = std:: | ||
+ | // KO | ||
+ | // using Tfalse = std:: | ||
+ | |||
+ | template < | ||
+ | struct LazyLoadIdentity | ||
+ | { | ||
+ | using type = T; | ||
+ | }; | ||
+ | |||
+ | template < | ||
+ | struct LazyLoadTy : LazyLoadIdentity< | ||
+ | |||
+ | // OK | ||
+ | using Ttrue = std:: | ||
+ | // KO | ||
+ | //using Tfalse = std:: | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
lang/cpp/templatespecialisation.1619003975.txt.gz · Dernière modification : 2021/04/21 13:19 de root