Je me suis posé une question aujourd'hui, sans lui trouver de raiponse
satisfaisante. Dans notre appli, on manipules plusieurs types de chaînes
de caractères (wide, narrow, utf8, case-insensitive ou pas), ces types
ayant des interfaces quasi identiques...
Voulant écrire une fonction qui marche avec tous ces types, j'ai écrit
une fonction templatisée par le type de chaîne. Le problème que j'ai eu,
c'est comment écrire des string litterals qui marchent dans tous les cas
(ces string litteraux servent pour des morceaux de chaines où l'i18n ne
pose pas de problèmes) ?
template<class String> bool test(String const &s)
{
return s == "Toto"; // Ou L"Toto" selon les cas
}
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
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
Arnaud Meurgues
Loïc Joly wrote:
c'est comment écrire des string litterals qui marchent dans tous les cas (ces string litteraux servent pour des morceaux de chaines où l'i18n ne pose pas de problèmes) ?
template<class String> bool test(String const &s) { return s == "Toto"; // Ou L"Toto" selon les cas }
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
Je ne suis pas sûr d'avoir compris ton problème. Tu veux éviter d'avoir à écrire
template<class String> bool test(String const &s) { return s == String("Toto"); // Ou L"Toto" selon les cas }
? C'est ça ?
-- Arnaud
Loïc Joly wrote:
c'est comment écrire des string litterals qui marchent dans tous les cas
(ces string litteraux servent pour des morceaux de chaines où l'i18n ne
pose pas de problèmes) ?
template<class String> bool test(String const &s)
{
return s == "Toto"; // Ou L"Toto" selon les cas
}
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des
suggestions ?
Je ne suis pas sûr d'avoir compris ton problème. Tu veux éviter d'avoir
à écrire
template<class String> bool test(String const &s)
{
return s == String("Toto"); // Ou L"Toto" selon les cas
}
c'est comment écrire des string litterals qui marchent dans tous les cas (ces string litteraux servent pour des morceaux de chaines où l'i18n ne pose pas de problèmes) ?
template<class String> bool test(String const &s) { return s == "Toto"; // Ou L"Toto" selon les cas }
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
Je ne suis pas sûr d'avoir compris ton problème. Tu veux éviter d'avoir à écrire
template<class String> bool test(String const &s) { return s == String("Toto"); // Ou L"Toto" selon les cas }
? C'est ça ?
-- Arnaud
Jean-Marc Bourguet
Loïc Joly writes:
template<class String> bool test(String const &s) { return s == "Toto"; // Ou L"Toto" selon les cas }
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
La seule chose qui me vient a l'esprit c'est un trait contenant les litteraux et specialise pour chaque type de string que tu as.
template<class String> bool test(String const &s) { return s == "Toto"; // Ou L"Toto" selon les cas }
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
La seule chose qui me vient a l'esprit c'est un trait contenant les litteraux et specialise pour chaque type de string que tu as.
A+
-- Jean-Marc
James Kanze
Jean-Marc Bourguet wrote:
Loïc Joly writes:
template<class String> bool test(String const &s) { return s == "Toto"; // Ou L"Toto" selon les cas }
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
La seule chose qui me vient a l'esprit c'est un trait contenant les litteraux et specialise pour chaque type de string que tu as.
Je ne vois rien de mieux non plus, mais je ne suis même pas sûr que ça marche. Le problème de base, c'est que le C++ n'a que deux types de constante de chaîne, pas un de plus. Et que ce que tu as dans la chaîne dépend bien de ce que le compilateur décide à te donner -- pour une chaîne constante, par exemple, tu ne peux pas dire au compilateur qu'il faut qu'il l'encode en UTF-8.
Si Loïc n'a besoin que des caractères de base, une solution possible serait de n'utiliser que des chaînes constantes classiques, et une classe de traits pour la conversion, genre :
template<class String> bool test(String const &s)
{
return s == "Toto"; // Ou L"Toto" selon les cas
}
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des
suggestions ?
La seule chose qui me vient a l'esprit c'est un trait contenant les
litteraux et specialise pour chaque type de string que tu as.
Je ne vois rien de mieux non plus, mais je ne suis même pas sûr
que ça marche. Le problème de base, c'est que le C++ n'a que
deux types de constante de chaîne, pas un de plus. Et que ce que
tu as dans la chaîne dépend bien de ce que le compilateur décide
à te donner -- pour une chaîne constante, par exemple, tu ne
peux pas dire au compilateur qu'il faut qu'il l'encode en UTF-8.
Si Loïc n'a besoin que des caractères de base, une solution
possible serait de n'utiliser que des chaînes constantes
classiques, et une classe de traits pour la conversion, genre :
template<class String> bool test(String const &s) { return s == "Toto"; // Ou L"Toto" selon les cas }
J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des suggestions ?
La seule chose qui me vient a l'esprit c'est un trait contenant les litteraux et specialise pour chaque type de string que tu as.
Je ne vois rien de mieux non plus, mais je ne suis même pas sûr que ça marche. Le problème de base, c'est que le C++ n'a que deux types de constante de chaîne, pas un de plus. Et que ce que tu as dans la chaîne dépend bien de ce que le compilateur décide à te donner -- pour une chaîne constante, par exemple, tu ne peux pas dire au compilateur qu'il faut qu'il l'encode en UTF-8.
Si Loïc n'a besoin que des caractères de base, une solution possible serait de n'utiliser que des chaînes constantes classiques, et une classe de traits pour la conversion, genre :