En faire plus à la compilation.
Bonjour à tous.
Voici une idée d'optimisation qui ma parcourue l'esprit.
Imaginons :
Code:
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;
} |
Ici, le compilateur peut remplacer Fc(a,b) par max(a,b) mais, on est limité à un seul type de fonction.
Cependant, un cas un peu plus générique :
Code:
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;
} |
Ne marche pas :
class ou typename attend un type et non une valeur.
Il faut donc faire :
Code:
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;
} |
Cependant, voici les problèmes que posent ce nouveau code (dans le cas où func est connu à la compilation) :
-Nécessité de stocker un membre de plus.
-Appelle d'un pointeur de fonction (dans l'autre cas on a inlining)
-Des erreurs possibles :
Code:
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;
} |
-Plein de problèmes !
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) ?