"kanze" écrivait:Franck Branjonneau wrote:"kanze" écrivait:Franck Branjonneau wrote:Yoxoman écrivait:La solution avec transform serait quelque chose du
genre :
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant.
Ca me fait penser à un film : Scanners. Ca parle de
gens capables de faire exploser le cerveau d'autres
presonnes à distance.
Si c'est le static_cast<> qui t'ennuie, tu peux l'enelever.
Tu en es sûr ?
Je n'ai aucune certitude.Il y a bien deux fonctions std::ctype<>::tolower, selon
la norme. C'est vrai que la deuxième prend deux
paramètres, et qu'il n'y a aucune instantiation de
std::mem_fun qui accepte l'adresse d'une fonction à deux
paramètres.
Oui mais ce ne sont pas des fonctions templates. Ce sont
des fonctions membres d'une classe template std::ctype<>.
Qui, elle, a été instanciée avec char, le compilateur doit
donc choisir entre les deux signatures
std::ctype< char >::tolower(char) const;
std::ctype< char >::tolower(char, const char) const;
pour choisir quelle std::mem_fun<> utiliser.
C'est juste, mais je ne crois pas que ça change grand chose.
Je crois que si.Pour déterminer les paramètres d'instantiation de
std::mem_fun<>, on se sert de la déduction des types, qui
elle ne fonctionne (je crois) qu'avec un type connu. Or,
pour connaître le type ici, il faut de la résolution du
surcharge.
Je ne suis pas sur que l'on puisse parler de résolution du
surcharge, même si ça revient au même.
Si j'ai bien compris la norme, la résolution du surcharge ne
se fait qu'une fois la déduction des types finie ; de toute
façon, il a besoin de l'instantiation pour faire la
résolution du surcharge.
"Résolution de surcharge" et déduction de type font parties de
la déduction des arguments templates (en particulier les
types) -- je crois que tu ne différencies pas "déduction de
type" et "déduction des arguments templates".
Mais tes commentaires m'ont amené a regardé dans la norme.
En fait, §14.8.2.2 dit bien que « Template arguments can be
deduced from the type specified when taking the address of
an overloaded function. »
Non, 14.8.2.2 c'est (l'emphase est mienne) « Deducing template
arguments taking the address of a function *template* »., et dans §14.8.2.4 :
In some cases, tye deduction is done using a single set
of types P and A. [P est le type du paramètre formel,
et A le type du paramètre réel].
in other cases, there will be a set of corresponding
types P and A.
Type deduction is done independantly for each P/A pair,
and the deduced template argument values are then
combined. If type decduction cannot be done for any P/A
pair, or if for any pair the deduction leads to more
than one possible set of deduced values, or if different
pairs yield different deduced values, or if any template
argument remains neither deduced nor explicilty
specified, template argument deduction fails.
Ce qui n'est pas particulièrement clair.
L'algorithme en lui même est accessible, determiner P/A est
malaisé.
Je pars de 14.8.2.1 « Deducing template arguments from a
function call » et je cale. Aussi je saute en 14.8.2.4/16 « A
template argument can be deduced from a pointer to function or
pointer to member function argument if the set of overloaded
functions does not contain function templates and at most one
of a set of overloaded functions provides a unique match. » Ce
qui, je crois, règle le cas de std::ctype<>::tolower.
Pour le cas de std::tolower/std::tolower<>, tu auras noté que
14.8.2.4/16 est similaire à la résolution de surcharge (dans
le sens de 13.4) avec une contrainte plus forte sur les
fonctions templates.
C'est cette contrainte qui, je crois, autorise g++-3.x (x à
voir) à rejeter
std::transform(
source.begin(), source.end(),
cible,
&::tolower)
Je note simplement que g++-4.0 compile ce code.
(C'est une analyse simpliste. Le cas pointeur sur fonction est
distinct du cas pointeur sur fonction membre, en particulier
14.8.2.4/1 prévoit des conversions sur T, A.)Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types c'est
déduction des arguments templates, alors non. L'analyse c'est
14.8.2.4/16.
"kanze" <kanze@gabi-soft.fr> écrivait:
Franck Branjonneau wrote:
"kanze" <kanze@gabi-soft.fr> écrivait:
Franck Branjonneau wrote:
Yoxoman <yoxoman@aol.com> écrivait:
La solution avec transform serait quelque chose du
genre :
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant.
Ca me fait penser à un film : Scanners. Ca parle de
gens capables de faire exploser le cerveau d'autres
presonnes à distance.
Si c'est le static_cast<> qui t'ennuie, tu peux l'enelever.
Tu en es sûr ?
Je n'ai aucune certitude.
Il y a bien deux fonctions std::ctype<>::tolower, selon
la norme. C'est vrai que la deuxième prend deux
paramètres, et qu'il n'y a aucune instantiation de
std::mem_fun qui accepte l'adresse d'une fonction à deux
paramètres.
Oui mais ce ne sont pas des fonctions templates. Ce sont
des fonctions membres d'une classe template std::ctype<>.
Qui, elle, a été instanciée avec char, le compilateur doit
donc choisir entre les deux signatures
std::ctype< char >::tolower(char) const;
std::ctype< char >::tolower(char, const char) const;
pour choisir quelle std::mem_fun<> utiliser.
C'est juste, mais je ne crois pas que ça change grand chose.
Je crois que si.
Pour déterminer les paramètres d'instantiation de
std::mem_fun<>, on se sert de la déduction des types, qui
elle ne fonctionne (je crois) qu'avec un type connu. Or,
pour connaître le type ici, il faut de la résolution du
surcharge.
Je ne suis pas sur que l'on puisse parler de résolution du
surcharge, même si ça revient au même.
Si j'ai bien compris la norme, la résolution du surcharge ne
se fait qu'une fois la déduction des types finie ; de toute
façon, il a besoin de l'instantiation pour faire la
résolution du surcharge.
"Résolution de surcharge" et déduction de type font parties de
la déduction des arguments templates (en particulier les
types) -- je crois que tu ne différencies pas "déduction de
type" et "déduction des arguments templates".
Mais tes commentaires m'ont amené a regardé dans la norme.
En fait, §14.8.2.2 dit bien que « Template arguments can be
deduced from the type specified when taking the address of
an overloaded function. »
Non, 14.8.2.2 c'est (l'emphase est mienne) « Deducing template
arguments taking the address of a function *template* ».
, et dans §14.8.2.4 :
In some cases, tye deduction is done using a single set
of types P and A. [P est le type du paramètre formel,
et A le type du paramètre réel].
in other cases, there will be a set of corresponding
types P and A.
Type deduction is done independantly for each P/A pair,
and the deduced template argument values are then
combined. If type decduction cannot be done for any P/A
pair, or if for any pair the deduction leads to more
than one possible set of deduced values, or if different
pairs yield different deduced values, or if any template
argument remains neither deduced nor explicilty
specified, template argument deduction fails.
Ce qui n'est pas particulièrement clair.
L'algorithme en lui même est accessible, determiner P/A est
malaisé.
Je pars de 14.8.2.1 « Deducing template arguments from a
function call » et je cale. Aussi je saute en 14.8.2.4/16 « A
template argument can be deduced from a pointer to function or
pointer to member function argument if the set of overloaded
functions does not contain function templates and at most one
of a set of overloaded functions provides a unique match. » Ce
qui, je crois, règle le cas de std::ctype<>::tolower.
Pour le cas de std::tolower/std::tolower<>, tu auras noté que
14.8.2.4/16 est similaire à la résolution de surcharge (dans
le sens de 13.4) avec une contrainte plus forte sur les
fonctions templates.
C'est cette contrainte qui, je crois, autorise g++-3.x (x à
voir) à rejeter
std::transform(
source.begin(), source.end(),
cible,
&::tolower)
Je note simplement que g++-4.0 compile ce code.
(C'est une analyse simpliste. Le cas pointeur sur fonction est
distinct du cas pointeur sur fonction membre, en particulier
14.8.2.4/1 prévoit des conversions sur T, A.)
Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types c'est
déduction des arguments templates, alors non. L'analyse c'est
14.8.2.4/16.
"kanze" écrivait:Franck Branjonneau wrote:"kanze" écrivait:Franck Branjonneau wrote:Yoxoman écrivait:La solution avec transform serait quelque chose du
genre :
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant.
Ca me fait penser à un film : Scanners. Ca parle de
gens capables de faire exploser le cerveau d'autres
presonnes à distance.
Si c'est le static_cast<> qui t'ennuie, tu peux l'enelever.
Tu en es sûr ?
Je n'ai aucune certitude.Il y a bien deux fonctions std::ctype<>::tolower, selon
la norme. C'est vrai que la deuxième prend deux
paramètres, et qu'il n'y a aucune instantiation de
std::mem_fun qui accepte l'adresse d'une fonction à deux
paramètres.
Oui mais ce ne sont pas des fonctions templates. Ce sont
des fonctions membres d'une classe template std::ctype<>.
Qui, elle, a été instanciée avec char, le compilateur doit
donc choisir entre les deux signatures
std::ctype< char >::tolower(char) const;
std::ctype< char >::tolower(char, const char) const;
pour choisir quelle std::mem_fun<> utiliser.
C'est juste, mais je ne crois pas que ça change grand chose.
Je crois que si.Pour déterminer les paramètres d'instantiation de
std::mem_fun<>, on se sert de la déduction des types, qui
elle ne fonctionne (je crois) qu'avec un type connu. Or,
pour connaître le type ici, il faut de la résolution du
surcharge.
Je ne suis pas sur que l'on puisse parler de résolution du
surcharge, même si ça revient au même.
Si j'ai bien compris la norme, la résolution du surcharge ne
se fait qu'une fois la déduction des types finie ; de toute
façon, il a besoin de l'instantiation pour faire la
résolution du surcharge.
"Résolution de surcharge" et déduction de type font parties de
la déduction des arguments templates (en particulier les
types) -- je crois que tu ne différencies pas "déduction de
type" et "déduction des arguments templates".
Mais tes commentaires m'ont amené a regardé dans la norme.
En fait, §14.8.2.2 dit bien que « Template arguments can be
deduced from the type specified when taking the address of
an overloaded function. »
Non, 14.8.2.2 c'est (l'emphase est mienne) « Deducing template
arguments taking the address of a function *template* »., et dans §14.8.2.4 :
In some cases, tye deduction is done using a single set
of types P and A. [P est le type du paramètre formel,
et A le type du paramètre réel].
in other cases, there will be a set of corresponding
types P and A.
Type deduction is done independantly for each P/A pair,
and the deduced template argument values are then
combined. If type decduction cannot be done for any P/A
pair, or if for any pair the deduction leads to more
than one possible set of deduced values, or if different
pairs yield different deduced values, or if any template
argument remains neither deduced nor explicilty
specified, template argument deduction fails.
Ce qui n'est pas particulièrement clair.
L'algorithme en lui même est accessible, determiner P/A est
malaisé.
Je pars de 14.8.2.1 « Deducing template arguments from a
function call » et je cale. Aussi je saute en 14.8.2.4/16 « A
template argument can be deduced from a pointer to function or
pointer to member function argument if the set of overloaded
functions does not contain function templates and at most one
of a set of overloaded functions provides a unique match. » Ce
qui, je crois, règle le cas de std::ctype<>::tolower.
Pour le cas de std::tolower/std::tolower<>, tu auras noté que
14.8.2.4/16 est similaire à la résolution de surcharge (dans
le sens de 13.4) avec une contrainte plus forte sur les
fonctions templates.
C'est cette contrainte qui, je crois, autorise g++-3.x (x à
voir) à rejeter
std::transform(
source.begin(), source.end(),
cible,
&::tolower)
Je note simplement que g++-4.0 compile ce code.
(C'est une analyse simpliste. Le cas pointeur sur fonction est
distinct du cas pointeur sur fonction membre, en particulier
14.8.2.4/1 prévoit des conversions sur T, A.)Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types c'est
déduction des arguments templates, alors non. L'analyse c'est
14.8.2.4/16.
[...]
Et j'avoue ne pas être sûr de la réponse, même avec la
norme sous les mains.
Pour le cas de std::tolower/std::tolower<>, tu auras noté que
14.8.2.4/16 est similaire à la résolution de surcharge (dans
le sens de 13.4) avec une contrainte plus forte sur les
fonctions templates.
Il y a des ressemblances. Mais la façon de procéder est quand
même différente. Surtout, il n'y a pas de « ranking » ; si deux
surcharges marchent, c'est une erreur, point à la ligne. On ne
cherche pas à en choisir un plutôt qu'un autre. (Au moins qu'il
y a quelque chose que j'ai raté -- ce qui est fort probable --
il n'y a même pas de préférence pour un match exact.)
C'est cette contrainte qui, je crois, autorise g++-3.x (x à
voir) à rejeter
std::transform(
source.begin(), source.end(),
cible,
&::tolower)
Je note simplement que g++-4.0 compile ce code.
(C'est une analyse simpliste. Le cas pointeur sur fonction est
distinct du cas pointeur sur fonction membre, en particulier
14.8.2.4/1 prévoit des conversions sur T, A.)Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types c'est
déduction des arguments templates, alors non. L'analyse c'est
14.8.2.4/16.
Bien sûr que si.
La seule question réele, c'est le traitement de l'ensemble de
surcharge dans la déduction des paramètres réels des templates.
[...]
Et j'avoue ne pas être sûr de la réponse, même avec la
norme sous les mains.
Pour le cas de std::tolower/std::tolower<>, tu auras noté que
14.8.2.4/16 est similaire à la résolution de surcharge (dans
le sens de 13.4) avec une contrainte plus forte sur les
fonctions templates.
Il y a des ressemblances. Mais la façon de procéder est quand
même différente. Surtout, il n'y a pas de « ranking » ; si deux
surcharges marchent, c'est une erreur, point à la ligne. On ne
cherche pas à en choisir un plutôt qu'un autre. (Au moins qu'il
y a quelque chose que j'ai raté -- ce qui est fort probable --
il n'y a même pas de préférence pour un match exact.)
C'est cette contrainte qui, je crois, autorise g++-3.x (x à
voir) à rejeter
std::transform(
source.begin(), source.end(),
cible,
&::tolower)
Je note simplement que g++-4.0 compile ce code.
(C'est une analyse simpliste. Le cas pointeur sur fonction est
distinct du cas pointeur sur fonction membre, en particulier
14.8.2.4/1 prévoit des conversions sur T, A.)
Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types c'est
déduction des arguments templates, alors non. L'analyse c'est
14.8.2.4/16.
Bien sûr que si.
La seule question réele, c'est le traitement de l'ensemble de
surcharge dans la déduction des paramètres réels des templates.
[...]
Et j'avoue ne pas être sûr de la réponse, même avec la
norme sous les mains.
Pour le cas de std::tolower/std::tolower<>, tu auras noté que
14.8.2.4/16 est similaire à la résolution de surcharge (dans
le sens de 13.4) avec une contrainte plus forte sur les
fonctions templates.
Il y a des ressemblances. Mais la façon de procéder est quand
même différente. Surtout, il n'y a pas de « ranking » ; si deux
surcharges marchent, c'est une erreur, point à la ligne. On ne
cherche pas à en choisir un plutôt qu'un autre. (Au moins qu'il
y a quelque chose que j'ai raté -- ce qui est fort probable --
il n'y a même pas de préférence pour un match exact.)
C'est cette contrainte qui, je crois, autorise g++-3.x (x à
voir) à rejeter
std::transform(
source.begin(), source.end(),
cible,
&::tolower)
Je note simplement que g++-4.0 compile ce code.
(C'est une analyse simpliste. Le cas pointeur sur fonction est
distinct du cas pointeur sur fonction membre, en particulier
14.8.2.4/1 prévoit des conversions sur T, A.)Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types c'est
déduction des arguments templates, alors non. L'analyse c'est
14.8.2.4/16.
Bien sûr que si.
La seule question réele, c'est le traitement de l'ensemble de
surcharge dans la déduction des paramètres réels des templates.
"kanze" écrivait:[...]Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types
c'est déduction des arguments templates, alors non.
L'analyse c'est 14.8.2.4/16.
Bien sûr que si.
La seule question réele, c'est le traitement de l'ensemble
de surcharge dans la déduction des paramètres réels des
templates.
C'est là que je ne suis pas d'accord : le traitement de
l'ensemble de surcharge dans la déduction des paramètres
templates n'est pas une résolution de surcharge -- on
n'utilise ni 13.3, ni 13.4.
"kanze" <kanze@gabi-soft.fr> écrivait:
[...]
Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types
c'est déduction des arguments templates, alors non.
L'analyse c'est 14.8.2.4/16.
Bien sûr que si.
La seule question réele, c'est le traitement de l'ensemble
de surcharge dans la déduction des paramètres réels des
templates.
C'est là que je ne suis pas d'accord : le traitement de
l'ensemble de surcharge dans la déduction des paramètres
templates n'est pas une résolution de surcharge -- on
n'utilise ni 13.3, ni 13.4.
"kanze" écrivait:[...]Il y a bien deux analyses distinctes : la déduction des
types, et la résolution des surcharges.
Si d'une part, résolution de surcharge c'est 13.3 -- et par
extension 13.4 -- et, d'autre part, déduction des types
c'est déduction des arguments templates, alors non.
L'analyse c'est 14.8.2.4/16.
Bien sûr que si.
La seule question réele, c'est le traitement de l'ensemble
de surcharge dans la déduction des paramètres réels des
templates.
C'est là que je ne suis pas d'accord : le traitement de
l'ensemble de surcharge dans la déduction des paramètres
templates n'est pas une résolution de surcharge -- on
n'utilise ni 13.3, ni 13.4.