Bonjour à tous.
Voici une idée d'optimisation qui ma parcourue l'esprit.
Imaginons :
Ici, le compilateur peut remplacer Fc(a,b) par max(a,b) mais, on est limité à un seul type de fonction.
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 //Exemple 1 template<typename T,const T&(*Fc)(const T&,const T&)=std::max<T> > class Test { private : T a; T b; public : Test(T u, T v) : a(u), b(v) {} T Max(){return Fc(a,b);} }; int main() { Test<int> a(0,1); std::cout<<a.Max(); return 0; }
Cependant, un cas un peu plus générique :
Ne marche pas :
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 //Exemple 2 template<typename T,class Fc=std::max<T> > class Test { private : T a; T b; public : Test(T u, T v) : a(u), b(v) {} T Max(){return Fc(a,b);} }; int main() { Test<int> a(0,1); std::cout<<a.Max(); return 0; }
class ou typename attend un type et non une valeur.
Il faut donc faire :
Cependant, voici les problèmes que posent ce nouveau code (dans le cas où func est connu à la compilation) :
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 //Exemple 3 template<typename T,typename Fc=const T&(*)(const T&,const T&) > class Test { private : T a; T b; Fc func; public : Test(T u, T v, Fc f=std::max<T>) : a(u), b(v), func(f) {} T Max(){return func(a,b);} }; int main() { Test<int> a(0,1); std::cout<<a.Max(); return 0; }
-Nécessité de stocker un membre de plus.
-Appelle d'un pointeur de fonction (dans l'autre cas on a inlining)
-Des erreurs possibles :
-Plein de problèmes !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int main() { Test<int, int(*)(int,int)> a(0,1, std::min<int>); std::cout<<a.Max(); return 0; }
Ce qui serait parfait : l'exemple deux qui ne marche pas.
Quelqu'un à t-il une solution ?
Est-ce du à une impossibilité technique ?
Est-ce prévu pour c++1x (je ne pense pas) ?
Partager