Bonjour à tous,
Je ne suis pas vraiment sûr du lien entre l'intitulé du post et son sujet réel mais j'ai du mal à formuler tout ça et je ne suis pas un grand spécialiste de metaprogrammation. Quoi qu'il en soit, voici un exemple de code concernant ma question:
Je reprend l'exemple wikki (un peu modifié) concernant la définition du SFINAE:
Maintenant je split ce code en deux header:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 struct Test { typedef int type; }; template < typename T > void f(typename T::type) {std::cout<<"def 1";} // definition #1 template < typename T > void f(T) {std::cout<<"def 2";} // definition #2 struct MaClasseDeTest { template < typename T > MaClasseDeTest(T param) { f<T>(5); } }; int main() { MaClasseDeTest t1(10); // call #1 Test temp; MaClasseDeTest t2(temp); // call #2 without error thanks to SFINAE }
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 //header file1.h, contient la version 'de base' de f et limplémentation de la classe MaClasseDeTest #include <iostream> template < typename T > void f(T) {std::cout<<"def 2";} // definition #2 struct MaClasseDeTest { template < typename T > MaClasseDeTest(T unused) { f<T>(5); } };
Le test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //header file2.h, contient une autre version de f #include <iostream> struct Test { typedef int type; }; template < typename T > void f(typename T::type) {std::cout<<"def 1";} // definition #1
Sous Visual 2010, le constructeur de MaClasseDeTest appelle bien les deux implémentations différentes de la fonction f dans les deux appels. Donc le fait le fait de séparer ces deux implémentations de f dans deux header différents avec cette modification de comportement est-il "standard" (je sais Visual un peu permissif et n'ai pas gcc sous la main). Cela veut-il bien dire que je peux ajouter un nouveau possible comportement au constructeur de MaClasseDeTest en incluant simplement un nouveau header contenant une nouvelle 'version' de f?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //main.cpp #include "file1.h" #include "file2.h" int main() { MaClasseDeTest t1(10); Test temp; MaClasseDeTest t2(temp); }
J’espère avoir été clair (ce qui n'est pas certain) et merci pour vos réponses.
Partager