OVH Cloud OVH Cloud

"templatiser" un string litteral

4 réponses
Avatar
Loïc Joly
Bonjour,

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 ?

Merci,

--
Loïc

4 réponses

Avatar
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

Avatar
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.

A+

--
Jean-Marc

Avatar
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< typename String >
bool
isWhatever( String const& s )
{
return s == StringTraits< String >.fromBasic( "whatever" ) ;
}

(Mais évidemment, le résultat de l'expression n'est plus une
constante, vue du compilateur.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Loïc Joly

J'avoue ne pas avoir trouvé de solution qui me satisfasse. Des
suggestions ?


Merci de vos réponses qui confirment que je ne suis pas passé à côté de
quelquechose.

--
Loïc