GNT sans publicité, site mobile, fonctionnalitées exclusives...

pb de conversion en std::string

Le
MGN
mon problème est simple.
J'ai un modèle de classe

template<class T>
modele
{
// blablabla

std::string display(void) const;
};

et dedans j'ai une méthode display qui fournit des renseignements sur le
contenu de modele (je simplifie pour aller à l'essentiel)
Ma question : y-a-t-il un moyen de savoir si l'opérateur de conversion
(std::string) est défini pour les objets de la classe T ?
Actuellement, la conversion est tentée à la compilation et modele<T> n'est
pas compilé si cette conversion n'est pas possible.
Je voudrais que la conversion soit testée à l'exécution
Est-ce que c'est possible ?
J'espère avoir été clair
Lire les 23 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 5
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #295402
On Thu, 12 Oct 2006 22:13:30 +0200, "MGN"
Ma question : y-a-t-il un moyen de savoir si l'opérateur de conversion
(std::string) est défini pour les objets de la classe T ?


En gros, tu voudrais faire un truc du style

template<class T>
struct modele
{
T un_T;
std::string display() const
{
if (T_a_un_operateur_de_conversion)
{
return std::string (un_T);
}
else
{
throw "Conversion impossible";
}
}
};

C'est bien ça ?

Fabien LE LEZ
Le #295401
On Thu, 12 Oct 2006 22:13:30 +0200, "MGN"
Ma question : y-a-t-il un moyen de savoir si l'opérateur de conversion
(std::string) est défini pour les objets de la classe T ?

Je voudrais que la conversion soit testée à l'exécution...


"Modern C++ design" (Alexandrescu), section 2.7 :

typedef char EstConvertible;
class PasConvertible { char dummy[2]; };

EstConvertible Test (std::string);
PasConvertible Test (...);

template <class T> struct EstConvertibleEnString
{
static bool operator ()
{
return sizeof (Test (T())) == sizeof (EstConvertible);
}
};


struct Avec
{ operator std::string() const; };

struct Sans
{ };

int main()
{
std::cerr << EstConvertibleEnString<Avec>()() << "n"
<< EstConvertibleEnString<Sans>()() << "n";
}



Note que tout est évalué à la compilation (comme toujours avec les
templates). Mais ça te donne un booléen, dont tu peux te servir à
l'exécution.

Fabien LE LEZ
Le #295400

template <class T> struct EstConvertibleEnString
{
static bool operator ()


Gloups... Erreur ici ! À remplacer par :
bool operator()() const

{
return sizeof (Test (T())) == sizeof (EstConvertible);


En fait, je ne sais pas pourquoi j'ai créé une classe ici. Une
fonction template aurait aussi bien convenu (enfin, je crois).

Fabien LE LEZ
Le #295399
Ma question : y-a-t-il un moyen de savoir si l'opérateur de conversion
(std::string) est défini pour les objets de la classe T ?

Je voudrais que la conversion soit testée à l'exécution...


"Modern C++ design" (Alexandrescu), section 2.7 :


[Y'a que moi, sur ce thread !?]

Petite précision : le code donné ici fonctionne si un T est
convertible en un std::string. Il répond "true" avec T == char*.

S'il faut vraiment tester, à l'exécution (i.e. le code doit
impérativement compiler), si "T::operator std::string() const" existe,
ça risque d'être plus compliqué.


kanze
Le #295395
Fabien LE LEZ wrote:
Ma question : y-a-t-il un moyen de savoir si l'opérateur de
conversion (std::string) est défini pour les objets de la
classe T ?

Je voudrais que la conversion soit testée à l'exécution...


"Modern C++ design" (Alexandrescu), section 2.7 :


[Y'a que moi, sur ce thread !?]


Ton posting indique 3 heures du mat'. C'est sûr qu'à cette
heure-là, je n'y suis pas.

Petite précision : le code donné ici fonctionne si un T est
convertible en un std::string. Il répond "true" avec T ==
char*.

S'il faut vraiment tester, à l'exécution (i.e. le code doit
impérativement compiler), si "T::operator std::string() const"
existe, ça risque d'être plus compliqué.


Qu'une classe ait une conversion en std::string ou non, ça ne
change pas lors de l'exécution. C'est bien connu déjà à la
compilation.

Ceci dit, je me méfierais beaucoup d'une telle classe. Des
opérateurs de conversion ont leur utilité dans des cas bien
précis, mais une conversion implicite en std::string, ça me
semble chercher les ennuis : des ambiguïtés ou des erreurs non
détecter par le compilateur. C'est à éviter dans le cas général.

En fait, l'idiome « standard » pour convertir un objet en
texte, c'est de fournir un opérateur
--
James Kanze GABI Software
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



Publicité
Suivre les réponses
Poster une réponse
Anonyme