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);
}
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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
nmartin <twxsAT@freeAT.fr> 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 ); }
[...] 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
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
nmartin <twxsAT@freeAT.fr> 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
[...] 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
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
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
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
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)
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)
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)