Bonjour à tous !
J'ai une question dans la lignée du sujet Restriction sur une classe template (dont j'étudie attentivement les réponses )
Dans les briques de bases de mon appli, il y a les fichiers suivant :
Error .h qui définit tous les codes d'erreurs utilisés dans le projet :
ErrorIO.h qui permet de convertir un code d'erreur entier en chaine lisible par un humain. Ce fichier est en C et il est d'ailleurs inclus dans un sous-projet en C.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 enum Error { // code d'erreur... };
et string_utility.h qui fournit une fonction de conversion générique vers string.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #include "Error.h" char* to_string(Error err);
Il n'y a aucune relation entre ErrorIO.h et string_utility.h à part l'include commun de Error.h. Notez aussi que les deux fonctions to_string ont des types de retour différents...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include "Error.h" template<typename T> std::string to_string(const T&) { std::ostringstream oss; oss << Value; return oss.str(); }
Je cherche à interdire dans mon code de plus haut niveau l'appel de la fonction to_string générique de string_utility.h quand le paramètre est un code d'erreur et forcer le client à utiliser la to_string() de ErrorIO.h
Dans l'idéal il suffirait de bien vérifier que string_utility.h n'est pas inclus et que ErrorIO.h le soit, mais vu que string_utility.h se retrouve inclus un peu partout dans le projet c'est presque impossible d'être sur.
En C++0x, il me semble qu'on pourrait résoudre le problème en supprimant explicitement la spécialisation pour une Error avec =delete
Si la personne qui cherche à faire un to_string() avec un Error n'a inclus que string_utility.h alors la compilation planterait sur la ligne du =delete, elle verrait le commentaire, inclurait ErrorIO.h et voila !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // Please don't use the generic to_string() function for error codes. // Include instead "ErrorIO.h" wich provide the correct to_string function for them. template <> std::string to_string<Error>(const Error&) = delete;
Mais comment fait-on en pur C++03 ? (et sans accès à boost)
Merci !
Partager