OVH Cloud OVH Cloud

Composition de function avec un "Non-Type Template Parameters"

12 réponses
Avatar
plouf
Bonjour à tous,

J'ai essayé de faire un template qui donne la fonction composée de deux
fonction (sans utilisé de "functor"). Je suis arrivé à ça :

#include <iostream>

template<typename T1,typename T2,typename T3, T1 f1(T2), T2 f2(T3)>
T1 compose_fct(T3 arg)
{
return f1(f2(arg));
};

int twice(int a)
{
return 2*a;
}

int square(int a)
{
return a*a;
}

int main()
{
int (*sqr_tw)(int) = compose_fct<int,int,int,square,twice>;

std::cout << sqr_tw(4) << " :: " << square(twice(4)) << std::endl;
std::cout << sqr_tw(5) << " :: " << square(twice(5)) << std::endl;
std::cout << sqr_tw(6) << " :: " << square(twice(6)) << std::endl;

return 0;
}

(testé avec gcc 3.4.4 et VS2005)

Je trouve dommage d'être obligé de mettre ces 3 "int" dans
compose_fct<int,int,int,square,twice> alors qu'on a toutes les informations
nécéssaire avec le type des functions.

Personne n'a une idée pour améliorer ça ?

Seb

2 réponses

1 2
Avatar
Michael DOUBEZ
30 Apr 2008 14:49:46 +0200, Michael DOUBEZ :

Imagine que square ait plusieurs spécialisations:
double square(double)
float square(float)
int square(int)


Mais en l'occurence, on n'en a qu'une. Le compilateur est capable de
déduire les types qui vont bien dans un tel cas.


Oui. Ce n'est pas ce que j'ai dit. J'ai dit que la spécialisation du
template se faisait par valeur (valeur d'un pointeur sur fonction) et
que nous ne pouvions pas avoir une valeur sans typage.

J'ai eu tort de mentionner la surcharge de fonction, l'exemple n'est pas
approprié. Tu as raison sur ce point.

Michael


Avatar
Fabien LE LEZ
On Mon, 05 May 2008 09:37:32 +0200, Michael DOUBEZ
:

Oui. Ce n'est pas ce que j'ai dit. J'ai dit que la spécialisation du
template se faisait par valeur (valeur d'un pointeur sur fonction) et
que nous ne pouvions pas avoir une valeur sans typage.


Certes, mais ça ne veut pas dire que le programmeur doit expliciter le
type.

J'ai eu tort de mentionner la surcharge de fonction, l'exemple n'est pas
approprié.


Sauf qu'en l'occurence, c'est effectivement le cas qui pose problème.

1 2