Salut !
Je m'intéresse au fonctionnement des classes de politique (policy classes), mais il y a une chose que je n'arrive pas à faire malgré mes nombreuses tentatives...
Je viens donc vous demander conseille.
Comme exemple, je prend celui qui est présent dans la FAQ (sans l'amélioration de la classe de trait pour que se soit plus lisible) :
Donc déjà, si j'ai bien compris, pour pouvoir utiliser "Accumule" il faut le faire de cette maniéré :
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 template <typename T> struct Addition { static void Accumuler(T& Resultat, const T& Valeur) { Resultat += Valeur; } }; template <typename T> struct Soustraction { static void Accumuler(T& Resultat, const T& Valeur) { Resultat -= Valeur; } }; template <typename T, typename Operation = Addition<T> > struct Accumulation { static T Accumule(const T* Debut, const T* Fin) { T Resultat = 0; for ( ; Debut < Fin; ++Debut) Operation::Accumuler(Resultat, *Debut); return Resultat; } }; template <typename T> T Accumule(const T* Debut, const T* Fin) { return Accumulation<T>::Accumule(Debut, Fin); } template <typename T, typename Operation> T Accumule(const T* Debut, const T* Fin) { return Accumulation<T, Operation>::Accumule(Debut, Fin); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int main() { int i[3]; i[0] = 3; i[1] = 4; i[2] = 5; printf("Addition = %d\n", Accumule(i, &i[3])); printf("Soustraction = %d\n", Accumule<int, Soustraction<int> >(i, &i[3])); }
On peu constater que pour effectuer l'opération par défaut, la syntaxe est beaucoup plus simple !
Donc si dans notre programme on a une seul opération à effectuer, on a plutôt intéré à la mettre comme opération par défaut...
Le problème est on que si on ne connais pas quel opération sera utiliser avent l'exécution, il faudrais avoir la possibilité de "changer" l'opération par défaut durant l'exécution du programme...
Malheureusement je n'arrive pas à voir comment faire...
Es qu'une tel chose est possible ?
Merci pour votre aide.
Partager