OVH Cloud OVH Cloud

template avec fonction template comme parametre

5 réponses
Avatar
nmartin
bonjour,
le fil precedent a fait remonté en moi une question que j'ai voulu poser
il y a bien longtemps.

j'avais une classe templaté qui effectué dans sa premiere version un
static_cast dans le code. à l'utilisation, le static s'est transformé en
dynamic_cast.

j'avais tenté a l'epoque de passer en parametre de ma classe
le type de cast en me basant sur le fait qu'un cast est une focntion
template avec pour prototype :
template<typename Target, typename Source> Target XXX_cast(Source );

j'avais lu sur le site de ibm si je ne me trompe qu'il etait possible
d'utiliser des fonctions templates comme parametre d'une classe template.

Mon probleme est que je n'ai jamais reussit a compiler le code.
Pour vous donner une idée je voulais avoir quelque chose dans ce style :

template < ... XXX_cast... >
class Test{
A * process(B* b){
return XXX_cast<A*>(b);
}
}


Test<mon_static_cast> test; ....


nicolas.

5 réponses

Avatar
Loïc Joly
bonjour,
le fil precedent a fait remonté en moi une question que j'ai voulu poser
il y a bien longtemps.

j'avais une classe templaté qui effectué dans sa premiere version un
static_cast dans le code. à l'utilisation, le static s'est transformé en
dynamic_cast.

j'avais tenté a l'epoque de passer en parametre de ma classe
le type de cast en me basant sur le fait qu'un cast est une focntion
template avec pour prototype :
template<typename Target, typename Source> Target XXX_cast(Source );


Ce qui est une mauvaise hypothèse.

Il s'agit de mots clef du langage.

Rien ne t'empêche de faire des fonctions template qui encapsulent ces
opérateurs, par contre.


--
Loïc

Avatar
fabien.chene
nmartin writes:

[...]
j'avais lu sur le site de ibm si je ne me trompe qu'il etait possible
d'utiliser des fonctions templates comme parametre d'une classe template.


C'est également faisable avec des foncteurs, et dans le cas présent,
je trouve cela plus simple.

Mon probleme est que je n'ai jamais reussit a compiler le code.
Pour vous donner une idée je voulais avoir quelque chose dans ce style :

template < ... XXX_cast... >
class Test{
A * process(B* b){
return XXX_cast<A*>(b);
}
}


Test<mon_static_cast> test; ....


Peut-être que quelquechose dans ce goût te conviendrai :

struct A {};
struct B : A {};

template <class T>
struct Static_cast_wrapper
{
template <class U>
T operator()( U const& u ) const
{ return static_cast<T>( u ); }
};

// Appliqué à ton exemple :

template < template <class> class Cast >
struct Test
{
A* process( B* b )
{ return Cast<A*>()( b ); }

};

int main()
{
Test<Static_cast_wrapper> test;

B b;
A* a = test.process( &b );
}


--
Fab

Avatar
nmartin
nmartin writes:


[...]
j'avais lu sur le site de ibm si je ne me trompe qu'il etait possible
d'utiliser des fonctions templates comme parametre d'une classe template.



C'est également faisable avec des foncteurs, et dans le cas présent,
je trouve cela plus simple.

[...]


Le princpipe des objets fonctions me gene un peu dans le sens ou
je suppose que j'ai dans mes lib mes porpres fonctions de cast sous
forme de fonctions template que j'utilise ailleur dans mon code. je n'ai
donc pas envis de les wrapper ou transformer ces fonctions en classes.

C'est ce que j'avais fini par faire tout de meme et ceci fonctionne,
mais ce qui m'avait géné, c'est que sur le web on me dit que je peux
mettre en parametre de classe un fonction template
et j'avais testé pas mal de syntaxes différentes sans succes.

j'etais resté sur ma faim avec 3 hypotheses :
- la norme n'autorise pas ce type de parametre
- la norme l'autorise mais pas mon compilateur (VC2005)
- c'est moi qui n'ai pas su ecrire la syntaxe correctement


Avatar
kanze
nmartin wrote:


[...]

Si tu parles des paramètres template d'un template, la norme
l'autorise bien, mais il y a encore des compilateurs qui ne le
supporte pas. (Y compris, peut-être VC 2005. Mais certainement
Sun CC 5.5.)


VC 2005 accepte les parametres "classe template" (le 7.1
egalement, je n'ai pas testé sur les autres) mais a priori pas
les fonctions template comme parametre...


J'avais lu trop vite. Il n'y a pas de paramètres template de
fonction. Un paramètre d'un template peut être une valeur (de
certains types seulement, et la valeur du paramètre réel doit
être une constante), un type, ou un template de classe.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
nmartin
nmartin wrote:



[...]

Si tu parles des paramètres template d'un template, la norme
l'autorise bien, mais il y a encore des compilateurs qui ne le
supporte pas. (Y compris, peut-être VC 2005. Mais certainement
Sun CC 5.5.)




VC 2005 accepte les parametres "classe template" (le 7.1
egalement, je n'ai pas testé sur les autres) mais a priori pas
les fonctions template comme parametre...



J'avais lu trop vite. Il n'y a pas de paramètres template de
fonction. Un paramètre d'un template peut être une valeur (de
certains types seulement, et la valeur du paramètre réel doit
être une constante), un type, ou un template de classe.

merci, ceci me rassure, c'est ce que je croyai jusqu'a ce que je tombe

sur une page ou il etait dit que c'etait accepté (le site paraissait
credible, mais je ne retrouve plus l'url)