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

Poser une question


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 ?
"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.
Gloups... Erreur ici ! À remplacer par :
bool operator()() const
En fait, je ne sais pas pourquoi j'ai créé une classe ici. Une
fonction template aurait aussi bien convenu (enfin, je crois).
[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é.
Ton posting indique 3 heures du mat'. C'est sûr qu'à cette
heure-là, je n'y suis pas.
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