Envoyé par
corrector
(Tu voulais dire NUL, je suppose.)
Oui je voulais parler du '\0'
Envoyé par
corrector
Rappelons que le code est :
std::use_facet< std::ctype<wchar_t> >(loc).narrow(&ws[0], &ws[ws.length()], '?', &res[0]);
Où vois-tu "end()"?
Ou un même un itérateur "juste APRES le dernier élément" ("one-past-the-end")?
Je voulais dire que narrow utilise ses deux premiers paramètres "comme" deux iterateurs ( sauf que se sont forcément des pointeurs qui sont attendu la) et que de ce fait le second paramètre attendu doit être un pointeur sur "one-past-the-end". Mais c'est vrai que l'écriture &ws[ws.length()] .
Envoyé par
corrector
Clause 23.3.4 [multiset] defines operator[] as data()[pos]
23.3.4 fait 4 pages! (je regarde n2315, là) Tu peux préciser?
Je me demandais juste ce qui était dit sur operator[] pour string. J'ai juste cité une partie de l'entrée
Envoyé par
JolyLoic
en demande comment c'était défini pour les string.
Mais ce qui me dérange le plus c'est le &res[0] dans
std::use_facet< std::ctype<wchar_t> >(loc).narrow(&ws[0], &ws[ws.length()], '?', &res[0]);
on va tenter d'écrire dans la string à partir de son premier élément ; il n'y a pas que la continuité qui peut poser problème. Cela touche à l'implémentation même des string (si elle partage un même buffer, ... ). A mon avis il vaut mieux passer par un petit vector intermédiaire .
Un truc du genre :
1 2 3 4 5 6 7 8 9 10 11 12 13
| std::string narrow(const std::wstring& ws , std::locale loc = std::locale("") )
{
std::vector<char> temp( ws.length() );
std::use_facet< std::ctype<wchar_t> >(loc).narrow( ws.data() , ws.data()+ws.length(), '?', &temp[0]);
return std::string(temp.begin(),temp.end());
}
std::wstring widen(const std::string& s, std::locale loc = std::locale(""))
{
std::vector<wchar_t> temp( s.length() );
std::use_facet< std::ctype<wchar_t> >(loc).widen( s.data() , s.data()+s.length(), &temp[0]);
return std::wstring(temp.begin(),temp.end());
} |
attention c'est juste une idée d'implémentation, non garantie
Partager