Bonjour,
J'aimerais faire une fonction où je mets des entiers dans une chaîne de
caractères. J'utilise donc un std::ostringstream avec les opérations de flux
qui vont bien. Tout marche impec.
Maintenant, dans la même fonction, je voudrais refaire la même opération...
Mais je ne sais pas comment effacer le strinstream dont je me suis servi
juste avant. Ca éviterait d'en créer un nouveau à chaque fois (ma solution
actuelle), et devoir trouver un nouveau nom de variables tout le temps
(fastidieux dans une fonction où je dois faire 10 ou 15 opération
semblables...).
Bonjour,
J'aimerais faire une fonction où je mets des entiers dans une chaîne de
caractères. J'utilise donc un std::ostringstream avec les opérations de flux
qui vont bien. Tout marche impec.
Maintenant, dans la même fonction, je voudrais refaire la même opération...
Mais je ne sais pas comment effacer le strinstream dont je me suis servi
juste avant. Ca éviterait d'en créer un nouveau à chaque fois (ma solution
actuelle), et devoir trouver un nouveau nom de variables tout le temps
(fastidieux dans une fonction où je dois faire 10 ou 15 opération
semblables...).
Bonjour,
J'aimerais faire une fonction où je mets des entiers dans une chaîne de
caractères. J'utilise donc un std::ostringstream avec les opérations de flux
qui vont bien. Tout marche impec.
Maintenant, dans la même fonction, je voudrais refaire la même opération...
Mais je ne sais pas comment effacer le strinstream dont je me suis servi
juste avant. Ca éviterait d'en créer un nouveau à chaque fois (ma solution
actuelle), et devoir trouver un nouveau nom de variables tout le temps
(fastidieux dans une fonction où je dois faire 10 ou 15 opération
semblables...).
J'ai cru voir dans une discussion récente entre James et Samuel que ce
n'était pas possible et qu'il fallait tout le temps créer un nouveau
ostream... Dites-moi que c'est faux ! ;-)
J'ai cru voir dans une discussion récente entre James et Samuel que ce
n'était pas possible et qu'il fallait tout le temps créer un nouveau
ostream... Dites-moi que c'est faux ! ;-)
J'ai cru voir dans une discussion récente entre James et Samuel que ce
n'était pas possible et qu'il fallait tout le temps créer un nouveau
ostream... Dites-moi que c'est faux ! ;-)
Michaël Monerau wrote:Bonjour,
J'aimerais faire une fonction où je mets des entiers dans une chaîne
de caractères. J'utilise donc un std::ostringstream avec les
opérations de flux qui vont bien. Tout marche impec.
Maintenant, dans la même fonction, je voudrais refaire la même
opération... Mais je ne sais pas comment effacer le strinstream dont
je me suis servi juste avant. Ca éviterait d'en créer un nouveau à
chaque fois (ma solution actuelle), et devoir trouver un nouveau nom
de variables tout le temps (fastidieux dans une fonction où je dois
faire 10 ou 15 opération semblables...).
Tu n'es pas obligé de trouver un nom de variable different a chaque
fois. Il te suffit de definir et d'utilise ta variable dans differents
bloc :
Chaque exemplaire de message n'est valide qu'entre les accolades qui
le declarent.Les choses ne doivent pas etre trop différentes de ce
qui se passerait si on pouvait vider les ostringstream.
Michaël Monerau wrote:
Bonjour,
J'aimerais faire une fonction où je mets des entiers dans une chaîne
de caractères. J'utilise donc un std::ostringstream avec les
opérations de flux qui vont bien. Tout marche impec.
Maintenant, dans la même fonction, je voudrais refaire la même
opération... Mais je ne sais pas comment effacer le strinstream dont
je me suis servi juste avant. Ca éviterait d'en créer un nouveau à
chaque fois (ma solution actuelle), et devoir trouver un nouveau nom
de variables tout le temps (fastidieux dans une fonction où je dois
faire 10 ou 15 opération semblables...).
Tu n'es pas obligé de trouver un nom de variable different a chaque
fois. Il te suffit de definir et d'utilise ta variable dans differents
bloc :
Chaque exemplaire de message n'est valide qu'entre les accolades qui
le declarent.Les choses ne doivent pas etre trop différentes de ce
qui se passerait si on pouvait vider les ostringstream.
Michaël Monerau wrote:Bonjour,
J'aimerais faire une fonction où je mets des entiers dans une chaîne
de caractères. J'utilise donc un std::ostringstream avec les
opérations de flux qui vont bien. Tout marche impec.
Maintenant, dans la même fonction, je voudrais refaire la même
opération... Mais je ne sais pas comment effacer le strinstream dont
je me suis servi juste avant. Ca éviterait d'en créer un nouveau à
chaque fois (ma solution actuelle), et devoir trouver un nouveau nom
de variables tout le temps (fastidieux dans une fonction où je dois
faire 10 ou 15 opération semblables...).
Tu n'es pas obligé de trouver un nom de variable different a chaque
fois. Il te suffit de definir et d'utilise ta variable dans differents
bloc :
Chaque exemplaire de message n'est valide qu'entre les accolades qui
le declarent.Les choses ne doivent pas etre trop différentes de ce
qui se passerait si on pouvait vider les ostringstream.
le Friday 19 September 2003 19:37, écrivit :J'ai cru voir dans une discussion récente entre James et Samuel que
ce n'était pas possible et qu'il fallait tout le temps créer un
nouveau ostream... Dites-moi que c'est faux ! ;-)
et bien.. comment dire .. :-)
bon, pour te faire plaisir, à la limite, c'est faux, vu que tu peux
extirper de std::basic_stringbuf des fonctions membre 'protected' qui
permettent d'extraire du stringstream seulement un sous-morceau du
buffer entier,
et qu'il t'est possible de remettre à zéro cette sous-séquence grace
à la fonction seekpos(..)
c'est exactement ce que j'ai fait pour mesurer par rapport à la
création à chaque fois d'un nouveau stringstream. (dans mon cas, à
chaque itération 4 variables sont formattées avec diveres options de
formattage, re-créer est ~ 2 fois plus lent, mais en fait pas plus
lent que réutiliser en appelant à chaque fois imbue(..) dessus. Enfin
bref..)
je te colle les bouts concernés dans une pièce jointe (mon code est
formatté sans limiter très strictement les lignes à 80 colonnes. la
limite dur est à 100 colonnes - ça passe largement dans ma fenêtre
emacs :)
utilise outsstream::clear_buffer() pour repositionner à 0 le pointeur
courant.
après utilisation du stream, le pointeur cur() pointe sur la fin des
caractères nouvellement insérés, et cur_str() renvoie le morceau de la
chaîne qui t'intéresse. (qui est aussi [begin(), cur()[
remarque que cette classe est un ostream, on mets des caractères
dedans, ils ne sortent jamais. (enfin, on les copie avec str(),
cur_str(), etc..)
je ne me suis pas du tout penché sur l'équivalent in|out, mais c'est
possible qu'il n'y ait pas grand chose à changer pour que ça marche,
au delà de dériver de basic_iostream au lieu de basic_ostream.
aussi, il faut bien penser que clear_buffer n'agit sur rien d'autre
que sur le pointeur de la position courante dans le buffer,
c'est très différent de reconstruire un autre stringstream : tous ses
flags(), rdstate(), exceptions(), iword() et pword() restent
inchangés.
tu peux essayer d'utiliser, ça compile et ça marche comme attendu sur
diverses plateformes, mais je ne suis pas sûr que le bon
fonctionnement de cette classe soit garanti par la norme (dans les
grandes lignes oui, par exple la norme impose que les chars soient
stockés de manière contigüe et donc utiliser [pbase(), pptr()[ est
valide)
le Friday 19 September 2003 19:37, cort@meloo.com écrivit :
J'ai cru voir dans une discussion récente entre James et Samuel que
ce n'était pas possible et qu'il fallait tout le temps créer un
nouveau ostream... Dites-moi que c'est faux ! ;-)
et bien.. comment dire .. :-)
bon, pour te faire plaisir, à la limite, c'est faux, vu que tu peux
extirper de std::basic_stringbuf des fonctions membre 'protected' qui
permettent d'extraire du stringstream seulement un sous-morceau du
buffer entier,
et qu'il t'est possible de remettre à zéro cette sous-séquence grace
à la fonction seekpos(..)
c'est exactement ce que j'ai fait pour mesurer par rapport à la
création à chaque fois d'un nouveau stringstream. (dans mon cas, à
chaque itération 4 variables sont formattées avec diveres options de
formattage, re-créer est ~ 2 fois plus lent, mais en fait pas plus
lent que réutiliser en appelant à chaque fois imbue(..) dessus. Enfin
bref..)
je te colle les bouts concernés dans une pièce jointe (mon code est
formatté sans limiter très strictement les lignes à 80 colonnes. la
limite dur est à 100 colonnes - ça passe largement dans ma fenêtre
emacs :)
utilise outsstream::clear_buffer() pour repositionner à 0 le pointeur
courant.
après utilisation du stream, le pointeur cur() pointe sur la fin des
caractères nouvellement insérés, et cur_str() renvoie le morceau de la
chaîne qui t'intéresse. (qui est aussi [begin(), cur()[
remarque que cette classe est un ostream, on mets des caractères
dedans, ils ne sortent jamais. (enfin, on les copie avec str(),
cur_str(), etc..)
je ne me suis pas du tout penché sur l'équivalent in|out, mais c'est
possible qu'il n'y ait pas grand chose à changer pour que ça marche,
au delà de dériver de basic_iostream au lieu de basic_ostream.
aussi, il faut bien penser que clear_buffer n'agit sur rien d'autre
que sur le pointeur de la position courante dans le buffer,
c'est très différent de reconstruire un autre stringstream : tous ses
flags(), rdstate(), exceptions(), iword() et pword() restent
inchangés.
tu peux essayer d'utiliser, ça compile et ça marche comme attendu sur
diverses plateformes, mais je ne suis pas sûr que le bon
fonctionnement de cette classe soit garanti par la norme (dans les
grandes lignes oui, par exple la norme impose que les chars soient
stockés de manière contigüe et donc utiliser [pbase(), pptr()[ est
valide)
le Friday 19 September 2003 19:37, écrivit :J'ai cru voir dans une discussion récente entre James et Samuel que
ce n'était pas possible et qu'il fallait tout le temps créer un
nouveau ostream... Dites-moi que c'est faux ! ;-)
et bien.. comment dire .. :-)
bon, pour te faire plaisir, à la limite, c'est faux, vu que tu peux
extirper de std::basic_stringbuf des fonctions membre 'protected' qui
permettent d'extraire du stringstream seulement un sous-morceau du
buffer entier,
et qu'il t'est possible de remettre à zéro cette sous-séquence grace
à la fonction seekpos(..)
c'est exactement ce que j'ai fait pour mesurer par rapport à la
création à chaque fois d'un nouveau stringstream. (dans mon cas, à
chaque itération 4 variables sont formattées avec diveres options de
formattage, re-créer est ~ 2 fois plus lent, mais en fait pas plus
lent que réutiliser en appelant à chaque fois imbue(..) dessus. Enfin
bref..)
je te colle les bouts concernés dans une pièce jointe (mon code est
formatté sans limiter très strictement les lignes à 80 colonnes. la
limite dur est à 100 colonnes - ça passe largement dans ma fenêtre
emacs :)
utilise outsstream::clear_buffer() pour repositionner à 0 le pointeur
courant.
après utilisation du stream, le pointeur cur() pointe sur la fin des
caractères nouvellement insérés, et cur_str() renvoie le morceau de la
chaîne qui t'intéresse. (qui est aussi [begin(), cur()[
remarque que cette classe est un ostream, on mets des caractères
dedans, ils ne sortent jamais. (enfin, on les copie avec str(),
cur_str(), etc..)
je ne me suis pas du tout penché sur l'équivalent in|out, mais c'est
possible qu'il n'y ait pas grand chose à changer pour que ça marche,
au delà de dériver de basic_iostream au lieu de basic_ostream.
aussi, il faut bien penser que clear_buffer n'agit sur rien d'autre
que sur le pointeur de la position courante dans le buffer,
c'est très différent de reconstruire un autre stringstream : tous ses
flags(), rdstate(), exceptions(), iword() et pword() restent
inchangés.
tu peux essayer d'utiliser, ça compile et ça marche comme attendu sur
diverses plateformes, mais je ne suis pas sûr que le bon
fonctionnement de cette classe soit garanti par la norme (dans les
grandes lignes oui, par exple la norme impose que les chars soient
stockés de manière contigüe et donc utiliser [pbase(), pptr()[ est
valide)
Je vais essayer sur mon VC 7.1 et je te tiens au courant.
Je vais essayer sur mon VC 7.1 et je te tiens au courant.
Je vais essayer sur mon VC 7.1 et je te tiens au courant.
std::streamsize pcount() const { return
static_cast<std::streamsize>(pptr() - pbase()); }
Voilà, donc ça fonctionne bien, mais est-ce que la désallocation se fait
bien ? Et est-ce que c'est bien plus rapide que d'en créer un autre ?
std::streamsize pcount() const { return
static_cast<std::streamsize>(pptr() - pbase()); }
Voilà, donc ça fonctionne bien, mais est-ce que la désallocation se fait
bien ? Et est-ce que c'est bien plus rapide que d'en créer un autre ?
std::streamsize pcount() const { return
static_cast<std::streamsize>(pptr() - pbase()); }
Voilà, donc ça fonctionne bien, mais est-ce que la désallocation se fait
bien ? Et est-ce que c'est bien plus rapide que d'en créer un autre ?
OK. Dans un sens, c'est pas énorme... si mes calculs sont bons, ça donne
du 4.51e-5 ms pour un clear_buffer et 3.18e-4 ms pour une recréation de
strinstream. Mais c'est vrai que pour commencer un projet, ça m'embête
vraiment d'utiliser une méthode lente. Je vais donc utiliser ta classe (si
tu m'en autorises ;-) ).
Sur quelle genre de machine as-tu testé cela ? C'était un Pentium 4 3GHz
ou un P2 300 ? :p
Oui, c'est assez effrayant. Je n'arrive pas à comprendre comment la classe
de ostream a pu être pensée, sans qu'on puisse l'effacer. C'est un choix
de design que je trouve profondément stupide, mais d'un autre côté, je
n'ai pas toutes les cartes en main pour juger...
Autrement, pour la class outsstream, je verrais bien un type de retour
'outsstream&' pour un appel à 'clear_buffer', pour permettre d'écrire
quelque chose du genre :
oss << 12345;
oss.clear_buffer () << 23;
// oss.cur_str() == "23"
OK. Dans un sens, c'est pas énorme... si mes calculs sont bons, ça donne
du 4.51e-5 ms pour un clear_buffer et 3.18e-4 ms pour une recréation de
strinstream. Mais c'est vrai que pour commencer un projet, ça m'embête
vraiment d'utiliser une méthode lente. Je vais donc utiliser ta classe (si
tu m'en autorises ;-) ).
Sur quelle genre de machine as-tu testé cela ? C'était un Pentium 4 3GHz
ou un P2 300 ? :p
Oui, c'est assez effrayant. Je n'arrive pas à comprendre comment la classe
de ostream a pu être pensée, sans qu'on puisse l'effacer. C'est un choix
de design que je trouve profondément stupide, mais d'un autre côté, je
n'ai pas toutes les cartes en main pour juger...
Autrement, pour la class outsstream, je verrais bien un type de retour
'outsstream&' pour un appel à 'clear_buffer', pour permettre d'écrire
quelque chose du genre :
oss << 12345;
oss.clear_buffer () << 23;
// oss.cur_str() == "23"
OK. Dans un sens, c'est pas énorme... si mes calculs sont bons, ça donne
du 4.51e-5 ms pour un clear_buffer et 3.18e-4 ms pour une recréation de
strinstream. Mais c'est vrai que pour commencer un projet, ça m'embête
vraiment d'utiliser une méthode lente. Je vais donc utiliser ta classe (si
tu m'en autorises ;-) ).
Sur quelle genre de machine as-tu testé cela ? C'était un Pentium 4 3GHz
ou un P2 300 ? :p
Oui, c'est assez effrayant. Je n'arrive pas à comprendre comment la classe
de ostream a pu être pensée, sans qu'on puisse l'effacer. C'est un choix
de design que je trouve profondément stupide, mais d'un autre côté, je
n'ai pas toutes les cartes en main pour juger...
Autrement, pour la class outsstream, je verrais bien un type de retour
'outsstream&' pour un appel à 'clear_buffer', pour permettre d'écrire
quelque chose du genre :
oss << 12345;
oss.clear_buffer () << 23;
// oss.cur_str() == "23"
le Saturday 20 September 2003 14:56, écrivit :OK. Dans un sens, c'est pas énorme... si mes calculs sont bons, ça
donne du 4.51e-5 ms pour un clear_buffer et 3.18e-4 ms pour une
recréation de strinstream. Mais c'est vrai que pour commencer un
projet, ça m'embête vraiment d'utiliser une méthode lente. Je vais
donc utiliser ta classe (si tu m'en autorises ;-) ).
Sur quelle genre de machine as-tu testé cela ? C'était un Pentium 4
3GHz ou un P2 300 ? :p
c'est une machine plutôt rapide, un P4 1.8 GHz.
effectivement, ce sont de toute façon des actions plutôt rapides.
la différence ne serait vraiment importante que dans un programme qui
passe son temps à formatter des variables. (j'imagine que ça peut
exister)
je me suis penché dessus parceque pour boost::format, je voudrais
fournir une classe aussi efficace que possible, qui ne souffre pas
excessivement de la comparaison avec printf, alors j'ai expérimenté
tout ce qui touche au stringstream.
(au final j'utilise un seul buffer, en recréant à chaque fois un
stream sur ce buffer. ça économise une bonne proportion du temps - un
formattage de 4 variables réordonnées tourne dans les 5x printf- ,
tout en ne subissant aucun effet 'sticky' quoique l'utilisateur
modifie dans le stream lors du formattage)
Oui, c'est assez effrayant. Je n'arrive pas à comprendre comment la
classe de ostream a pu être pensée, sans qu'on puisse l'effacer.
C'est un choix de design que je trouve profondément stupide, mais
d'un autre côté, je n'ai pas toutes les cartes en main pour juger...
moi aussi, je trouve ça dommage qu'il n'aie été décidé de forcer
l'utilisation kleenex des stringstream, même dans les cas où il serait
avantageux de réutiliser au moins le buffer d'un formattage à l'autre,
alors que ça ne demande très peu de chose (soit rendre public pptr()
et pbase(), soit fournir une fonction cur_str() en plus de str() ).
Et aussi le fait même que dans un stringbuf le pointeur de fin doive
correspondre à la fin de la séquence des caractères entrés plutôt
qu'à la fin du tableau alloué (ça fait qu'overflow est appelé à
chaque appel à sputc) est idiot. D'ailleurs la stdlib du compilo
intel-7.1 n'est pas conforme à la norme sur ce point, et c'est mieux
comme ça (cependant pour exhiber le comportement non-conforme en
pratique faut vraiment le faire exprès, dériver de leur stringbuf et
obtenir l'accès à pptr() / pend())
En général le gâchis de temps ne gêne pas trop, mais pour des
programmes spécifiques ça peut obliger à refaire un stringbuf plus
efficace, alors que celui de la stdlib pourrait être modifié pour
être aussi efficace que voulu. c'est dommage..
enfin, comme de toute façon j'essaie que boost::format compile sur des
compilos qui n'ont pas de stringstream, finalement ça donne une
raison de plus pour faire mon stringbuf custom.
le Saturday 20 September 2003 14:56, cort@meloo.com écrivit :
OK. Dans un sens, c'est pas énorme... si mes calculs sont bons, ça
donne du 4.51e-5 ms pour un clear_buffer et 3.18e-4 ms pour une
recréation de strinstream. Mais c'est vrai que pour commencer un
projet, ça m'embête vraiment d'utiliser une méthode lente. Je vais
donc utiliser ta classe (si tu m'en autorises ;-) ).
Sur quelle genre de machine as-tu testé cela ? C'était un Pentium 4
3GHz ou un P2 300 ? :p
c'est une machine plutôt rapide, un P4 1.8 GHz.
effectivement, ce sont de toute façon des actions plutôt rapides.
la différence ne serait vraiment importante que dans un programme qui
passe son temps à formatter des variables. (j'imagine que ça peut
exister)
je me suis penché dessus parceque pour boost::format, je voudrais
fournir une classe aussi efficace que possible, qui ne souffre pas
excessivement de la comparaison avec printf, alors j'ai expérimenté
tout ce qui touche au stringstream.
(au final j'utilise un seul buffer, en recréant à chaque fois un
stream sur ce buffer. ça économise une bonne proportion du temps - un
formattage de 4 variables réordonnées tourne dans les 5x printf- ,
tout en ne subissant aucun effet 'sticky' quoique l'utilisateur
modifie dans le stream lors du formattage)
Oui, c'est assez effrayant. Je n'arrive pas à comprendre comment la
classe de ostream a pu être pensée, sans qu'on puisse l'effacer.
C'est un choix de design que je trouve profondément stupide, mais
d'un autre côté, je n'ai pas toutes les cartes en main pour juger...
moi aussi, je trouve ça dommage qu'il n'aie été décidé de forcer
l'utilisation kleenex des stringstream, même dans les cas où il serait
avantageux de réutiliser au moins le buffer d'un formattage à l'autre,
alors que ça ne demande très peu de chose (soit rendre public pptr()
et pbase(), soit fournir une fonction cur_str() en plus de str() ).
Et aussi le fait même que dans un stringbuf le pointeur de fin doive
correspondre à la fin de la séquence des caractères entrés plutôt
qu'à la fin du tableau alloué (ça fait qu'overflow est appelé à
chaque appel à sputc) est idiot. D'ailleurs la stdlib du compilo
intel-7.1 n'est pas conforme à la norme sur ce point, et c'est mieux
comme ça (cependant pour exhiber le comportement non-conforme en
pratique faut vraiment le faire exprès, dériver de leur stringbuf et
obtenir l'accès à pptr() / pend())
En général le gâchis de temps ne gêne pas trop, mais pour des
programmes spécifiques ça peut obliger à refaire un stringbuf plus
efficace, alors que celui de la stdlib pourrait être modifié pour
être aussi efficace que voulu. c'est dommage..
enfin, comme de toute façon j'essaie que boost::format compile sur des
compilos qui n'ont pas de stringstream, finalement ça donne une
raison de plus pour faire mon stringbuf custom.
le Saturday 20 September 2003 14:56, écrivit :OK. Dans un sens, c'est pas énorme... si mes calculs sont bons, ça
donne du 4.51e-5 ms pour un clear_buffer et 3.18e-4 ms pour une
recréation de strinstream. Mais c'est vrai que pour commencer un
projet, ça m'embête vraiment d'utiliser une méthode lente. Je vais
donc utiliser ta classe (si tu m'en autorises ;-) ).
Sur quelle genre de machine as-tu testé cela ? C'était un Pentium 4
3GHz ou un P2 300 ? :p
c'est une machine plutôt rapide, un P4 1.8 GHz.
effectivement, ce sont de toute façon des actions plutôt rapides.
la différence ne serait vraiment importante que dans un programme qui
passe son temps à formatter des variables. (j'imagine que ça peut
exister)
je me suis penché dessus parceque pour boost::format, je voudrais
fournir une classe aussi efficace que possible, qui ne souffre pas
excessivement de la comparaison avec printf, alors j'ai expérimenté
tout ce qui touche au stringstream.
(au final j'utilise un seul buffer, en recréant à chaque fois un
stream sur ce buffer. ça économise une bonne proportion du temps - un
formattage de 4 variables réordonnées tourne dans les 5x printf- ,
tout en ne subissant aucun effet 'sticky' quoique l'utilisateur
modifie dans le stream lors du formattage)
Oui, c'est assez effrayant. Je n'arrive pas à comprendre comment la
classe de ostream a pu être pensée, sans qu'on puisse l'effacer.
C'est un choix de design que je trouve profondément stupide, mais
d'un autre côté, je n'ai pas toutes les cartes en main pour juger...
moi aussi, je trouve ça dommage qu'il n'aie été décidé de forcer
l'utilisation kleenex des stringstream, même dans les cas où il serait
avantageux de réutiliser au moins le buffer d'un formattage à l'autre,
alors que ça ne demande très peu de chose (soit rendre public pptr()
et pbase(), soit fournir une fonction cur_str() en plus de str() ).
Et aussi le fait même que dans un stringbuf le pointeur de fin doive
correspondre à la fin de la séquence des caractères entrés plutôt
qu'à la fin du tableau alloué (ça fait qu'overflow est appelé à
chaque appel à sputc) est idiot. D'ailleurs la stdlib du compilo
intel-7.1 n'est pas conforme à la norme sur ce point, et c'est mieux
comme ça (cependant pour exhiber le comportement non-conforme en
pratique faut vraiment le faire exprès, dériver de leur stringbuf et
obtenir l'accès à pptr() / pend())
En général le gâchis de temps ne gêne pas trop, mais pour des
programmes spécifiques ça peut obliger à refaire un stringbuf plus
efficace, alors que celui de la stdlib pourrait être modifié pour
être aussi efficace que voulu. c'est dommage..
enfin, comme de toute façon j'essaie que boost::format compile sur des
compilos qui n'ont pas de stringstream, finalement ça donne une
raison de plus pour faire mon stringbuf custom.