Bonjour � tous.
Voici une id�e d'optimisation qui ma parcourue l'esprit.

Imaginons :

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;
}
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 : 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;
}
Ne marche pas :

class ou typename attend un type et non une valeur.
Il faut donc faire :

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