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:


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
}
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
 
//header file1.h, contient la version 'de base' de f et l’implé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);
     }
};
et

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
Le test:
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); 
}
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?

J’espère avoir été clair (ce qui n'est pas certain) et merci pour vos réponses.