Michael DOUBEZ wrote on 22/06/2007 08:57:[snip]certes, mais transmettre la chaîne opérande est (supportablement mais
inutilement) lourd, se rappeler l'ordre de 2 params est déjà dur,
alors 3 ! ;)
Si il n'y a que ça pour faire plaisir :):
string& replace(const string& str, const pair<const string,const
string>& fromto);
je lis ça comme une fonction recevant une /const string&/ et me
retournant celle-ci modifiée dans un /string&/ c'est précisément les
confusions qu'il ne me paraissait pas utile d'introduire.
Michael DOUBEZ wrote on 22/06/2007 08:57:
[snip]
certes, mais transmettre la chaîne opérande est (supportablement mais
inutilement) lourd, se rappeler l'ordre de 2 params est déjà dur,
alors 3 ! ;)
Si il n'y a que ça pour faire plaisir :):
string& replace(const string& str, const pair<const string,const
string>& fromto);
je lis ça comme une fonction recevant une /const string&/ et me
retournant celle-ci modifiée dans un /string&/ c'est précisément les
confusions qu'il ne me paraissait pas utile d'introduire.
Michael DOUBEZ wrote on 22/06/2007 08:57:[snip]certes, mais transmettre la chaîne opérande est (supportablement mais
inutilement) lourd, se rappeler l'ordre de 2 params est déjà dur,
alors 3 ! ;)
Si il n'y a que ça pour faire plaisir :):
string& replace(const string& str, const pair<const string,const
string>& fromto);
je lis ça comme une fonction recevant une /const string&/ et me
retournant celle-ci modifiée dans un /string&/ c'est précisément les
confusions qu'il ne me paraissait pas utile d'introduire.
Michael DOUBEZ wrote on 22/06/2007 08:57:[snip]certes, mais transmettre la chaîne opérande est (supportablement
mais inutilement) lourd, se rappeler l'ordre de 2 params est déjà
dur, alors 3 ! ;)
Si il n'y a que ça pour faire plaisir :):
string& replace(const string& str, const pair<const string,const
string>& fromto);
je lis ça comme une fonction recevant une /const string&/ et me
retournant celle-ci modifiée dans un /string&/ c'est précisément les
confusions qu'il ne me paraissait pas utile d'introduire.
Erreur de ma part:
string& replace(string& str, const pair<const string,const string>&
fromto);
Le const_cast<> serait un comportement indéfini.
Michael DOUBEZ wrote on 22/06/2007 08:57:
[snip]
certes, mais transmettre la chaîne opérande est (supportablement
mais inutilement) lourd, se rappeler l'ordre de 2 params est déjà
dur, alors 3 ! ;)
Si il n'y a que ça pour faire plaisir :):
string& replace(const string& str, const pair<const string,const
string>& fromto);
je lis ça comme une fonction recevant une /const string&/ et me
retournant celle-ci modifiée dans un /string&/ c'est précisément les
confusions qu'il ne me paraissait pas utile d'introduire.
Erreur de ma part:
string& replace(string& str, const pair<const string,const string>&
fromto);
Le const_cast<> serait un comportement indéfini.
Michael DOUBEZ wrote on 22/06/2007 08:57:[snip]certes, mais transmettre la chaîne opérande est (supportablement
mais inutilement) lourd, se rappeler l'ordre de 2 params est déjà
dur, alors 3 ! ;)
Si il n'y a que ça pour faire plaisir :):
string& replace(const string& str, const pair<const string,const
string>& fromto);
je lis ça comme une fonction recevant une /const string&/ et me
retournant celle-ci modifiée dans un /string&/ c'est précisément les
confusions qu'il ne me paraissait pas utile d'introduire.
Erreur de ma part:
string& replace(string& str, const pair<const string,const string>&
fromto);
Le const_cast<> serait un comportement indéfini.
Je trouve quand même injuste que le langage limite l'utilisation des
variable temporaire aux paramètres de type const. Ca force une
utilisation fonctionnelle du C++.
Je suppose qu'il y a une raison à cela.
Je trouve quand même injuste que le langage limite l'utilisation des
variable temporaire aux paramètres de type const. Ca force une
utilisation fonctionnelle du C++.
Je suppose qu'il y a une raison à cela.
Je trouve quand même injuste que le langage limite l'utilisation des
variable temporaire aux paramètres de type const. Ca force une
utilisation fonctionnelle du C++.
Je suppose qu'il y a une raison à cela.
Michael DOUBEZ writes:Je trouve quand même injuste que le langage limite l'utilisation des
variable temporaire aux paramètres de type const. Ca force une
utilisation fonctionnelle du C++.
Je suppose que tu veux dire qu'on ne peut pas binder une rvalue a une
reference non const.
On peut binder une temporaire a une reference non
const, si on reussi a en avoir une vision non rvalue (le plus simple est
d'appeler un membre qui renvoie une reference vers *this).
Note que quand on passe une rvalue a une reference non constante, on
introduit un temporaire (et donc l'appel a un constructeur de copie meme
s'il peut etre supprime)
Je suppose qu'il y a une raison à cela.
Je crois que c'est plutot un effet de bord d'un modele un peu complique
quand interviennent les notions de lvalue, rvalue referant a des objets et
rvalue ne referant pas a des objets. L'interdiction est tres sensee pour
les rvalue "non objet", moins pour les rvalue "objet".
A noter que C0X introduit des rvalue references qui permettent aussi
d'autres choses (en autre de donner une semantique de deplacement a
certaines operations, ce qu'autoriser simplement le passage de rvalue
"objet" a des references non constante n'aurait pas permis).
Michael DOUBEZ <michael.doubez@free.fr> writes:
Je trouve quand même injuste que le langage limite l'utilisation des
variable temporaire aux paramètres de type const. Ca force une
utilisation fonctionnelle du C++.
Je suppose que tu veux dire qu'on ne peut pas binder une rvalue a une
reference non const.
On peut binder une temporaire a une reference non
const, si on reussi a en avoir une vision non rvalue (le plus simple est
d'appeler un membre qui renvoie une reference vers *this).
Note que quand on passe une rvalue a une reference non constante, on
introduit un temporaire (et donc l'appel a un constructeur de copie meme
s'il peut etre supprime)
Je suppose qu'il y a une raison à cela.
Je crois que c'est plutot un effet de bord d'un modele un peu complique
quand interviennent les notions de lvalue, rvalue referant a des objets et
rvalue ne referant pas a des objets. L'interdiction est tres sensee pour
les rvalue "non objet", moins pour les rvalue "objet".
A noter que C0X introduit des rvalue references qui permettent aussi
d'autres choses (en autre de donner une semantique de deplacement a
certaines operations, ce qu'autoriser simplement le passage de rvalue
"objet" a des references non constante n'aurait pas permis).
Michael DOUBEZ writes:Je trouve quand même injuste que le langage limite l'utilisation des
variable temporaire aux paramètres de type const. Ca force une
utilisation fonctionnelle du C++.
Je suppose que tu veux dire qu'on ne peut pas binder une rvalue a une
reference non const.
On peut binder une temporaire a une reference non
const, si on reussi a en avoir une vision non rvalue (le plus simple est
d'appeler un membre qui renvoie une reference vers *this).
Note que quand on passe une rvalue a une reference non constante, on
introduit un temporaire (et donc l'appel a un constructeur de copie meme
s'il peut etre supprime)
Je suppose qu'il y a une raison à cela.
Je crois que c'est plutot un effet de bord d'un modele un peu complique
quand interviennent les notions de lvalue, rvalue referant a des objets et
rvalue ne referant pas a des objets. L'interdiction est tres sensee pour
les rvalue "non objet", moins pour les rvalue "objet".
A noter que C0X introduit des rvalue references qui permettent aussi
d'autres choses (en autre de donner une semantique de deplacement a
certaines operations, ce qu'autoriser simplement le passage de rvalue
"objet" a des references non constante n'aurait pas permis).
Note que quand on passe une rvalue a une reference non constante, on
introduit un temporaire (et donc l'appel a un constructeur de copie
meme s'il peut etre supprime)
Ca doit être dépendant du compilateur. Un exemple simple n'a pas appelé
l'opérateur de recopie sous gcc avec le template ci-dessus.
Je suppose qu'il y a une raison à cela.
Je crois que c'est plutot un effet de bord d'un modele un peu complique
quand interviennent les notions de lvalue, rvalue referant a des objets et
rvalue ne referant pas a des objets. L'interdiction est tres sensee pour
les rvalue "non objet", moins pour les rvalue "objet".
Pour les rvalues "non objet", je comprends pourquoi cela serait inutile et
même cela pourrait amener des bugs difficilement détectables. Mais je ne
comprends pas pourquoi cela a été interdit.
A noter que C0X introduit des rvalue references qui permettent aussi
d'autres choses (en autre de donner une semantique de deplacement a
certaines operations, ce qu'autoriser simplement le passage de rvalue
"objet" a des references non constante n'aurait pas permis).
Je ne comprends pas. C0x autorise-t-il les rvalues reference ou y a-t-il
une sémantique particulière ?
Note que quand on passe une rvalue a une reference non constante, on
introduit un temporaire (et donc l'appel a un constructeur de copie
meme s'il peut etre supprime)
Ca doit être dépendant du compilateur. Un exemple simple n'a pas appelé
l'opérateur de recopie sous gcc avec le template ci-dessus.
Je suppose qu'il y a une raison à cela.
Je crois que c'est plutot un effet de bord d'un modele un peu complique
quand interviennent les notions de lvalue, rvalue referant a des objets et
rvalue ne referant pas a des objets. L'interdiction est tres sensee pour
les rvalue "non objet", moins pour les rvalue "objet".
Pour les rvalues "non objet", je comprends pourquoi cela serait inutile et
même cela pourrait amener des bugs difficilement détectables. Mais je ne
comprends pas pourquoi cela a été interdit.
A noter que C0X introduit des rvalue references qui permettent aussi
d'autres choses (en autre de donner une semantique de deplacement a
certaines operations, ce qu'autoriser simplement le passage de rvalue
"objet" a des references non constante n'aurait pas permis).
Je ne comprends pas. C0x autorise-t-il les rvalues reference ou y a-t-il
une sémantique particulière ?
Note que quand on passe une rvalue a une reference non constante, on
introduit un temporaire (et donc l'appel a un constructeur de copie
meme s'il peut etre supprime)
Ca doit être dépendant du compilateur. Un exemple simple n'a pas appelé
l'opérateur de recopie sous gcc avec le template ci-dessus.
Je suppose qu'il y a une raison à cela.
Je crois que c'est plutot un effet de bord d'un modele un peu complique
quand interviennent les notions de lvalue, rvalue referant a des objets et
rvalue ne referant pas a des objets. L'interdiction est tres sensee pour
les rvalue "non objet", moins pour les rvalue "objet".
Pour les rvalues "non objet", je comprends pourquoi cela serait inutile et
même cela pourrait amener des bugs difficilement détectables. Mais je ne
comprends pas pourquoi cela a été interdit.
A noter que C0X introduit des rvalue references qui permettent aussi
d'autres choses (en autre de donner une semantique de deplacement a
certaines operations, ce qu'autoriser simplement le passage de rvalue
"objet" a des references non constante n'aurait pas permis).
Je ne comprends pas. C0x autorise-t-il les rvalues reference ou y a-t-il
une sémantique particulière ?
Une fois la fonction générique écrite, la différence n'est pas flagrante:
//avec regex
//en priant que fromstr n'ai pas de caractères spéciaux
boost::regex e(string("(")+fromstr+")");
Une fois la fonction générique écrite, la différence n'est pas flagrante:
//avec regex
//en priant que fromstr n'ai pas de caractères spéciaux
boost::regex e(string("(")+fromstr+")");
Une fois la fonction générique écrite, la différence n'est pas flagrante:
//avec regex
//en priant que fromstr n'ai pas de caractères spéciaux
boost::regex e(string("(")+fromstr+")");
Une fois la fonction générique écrite, la différence n'est pas flagrante:
Au niveau performance, quelque peu, si.
//avec regex
//en priant que fromstr n'ai pas de caractères spéciaux
boost::regex e(string("(")+fromstr+")");
L'informatique n'est pas affaire de religion.
Utilise plutôt boost::regex_constants::literal en second argument.
Une fois la fonction générique écrite, la différence n'est pas flagrante:
Au niveau performance, quelque peu, si.
//avec regex
//en priant que fromstr n'ai pas de caractères spéciaux
boost::regex e(string("(")+fromstr+")");
L'informatique n'est pas affaire de religion.
Utilise plutôt boost::regex_constants::literal en second argument.
Une fois la fonction générique écrite, la différence n'est pas flagrante:
Au niveau performance, quelque peu, si.
//avec regex
//en priant que fromstr n'ai pas de caractères spéciaux
boost::regex e(string("(")+fromstr+")");
L'informatique n'est pas affaire de religion.
Utilise plutôt boost::regex_constants::literal en second argument.
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent. AMA, à la fin de
la journée, une recherche dans une string est une comparaison des
éléments qui la compose.
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent. AMA, à la fin de
la journée, une recherche dans une string est une comparaison des
éléments qui la compose.
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent. AMA, à la fin de
la journée, une recherche dans une string est une comparaison des
éléments qui la compose.
Une fois la fonction générique écrite, la différence n'est
pas flagrante:
Au niveau performance, quelque peu, si.
Au niveau du nombre de ligne de code non.
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent.
AMA, à la fin de la journée, une recherche dans une string est
une comparaison des éléments qui la compose.
Une fois la fonction générique écrite, la différence n'est
pas flagrante:
Au niveau performance, quelque peu, si.
Au niveau du nombre de ligne de code non.
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent.
AMA, à la fin de la journée, une recherche dans une string est
une comparaison des éléments qui la compose.
Une fois la fonction générique écrite, la différence n'est
pas flagrante:
Au niveau performance, quelque peu, si.
Au niveau du nombre de ligne de code non.
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent.
AMA, à la fin de la journée, une recherche dans une string est
une comparaison des éléments qui la compose.
Michael DOUBEZ wrote on 25/06/2007 08:56:Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent. AMA, à la fi n de
la journée, une recherche dans une string est une comparaison des
éléments qui la compose.
pour une recherche mono-pattern, il apparait en effet qu'il faudrait
faire des efforts pour inventer un algo plus lent que la moyenne; pour
une recherche simultanée de plusierus patterns, les diffs de perfs
peuvent être plus significatives.
Michael DOUBEZ wrote on 25/06/2007 08:56:
Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent. AMA, à la fi n de
la journée, une recherche dans une string est une comparaison des
éléments qui la compose.
pour une recherche mono-pattern, il apparait en effet qu'il faudrait
faire des efforts pour inventer un algo plus lent que la moyenne; pour
une recherche simultanée de plusierus patterns, les diffs de perfs
peuvent être plus significatives.
Michael DOUBEZ wrote on 25/06/2007 08:56:Pour les performances, je n'ai pas fait de bench mais je ne vois pas
pourquoi l'algorithme que j'ai donné serait plus lent. AMA, à la fi n de
la journée, une recherche dans une string est une comparaison des
éléments qui la compose.
pour une recherche mono-pattern, il apparait en effet qu'il faudrait
faire des efforts pour inventer un algo plus lent que la moyenne; pour
une recherche simultanée de plusierus patterns, les diffs de perfs
peuvent être plus significatives.