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) ?