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