Restriction sur une fonction template
Bonjour à tous !
J'ai une question dans la lignée du sujet Restriction sur une classe template (dont j'étudie attentivement les réponses :D)
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 :
Code:
1 2 3 4 5
|
enum Error
{
// code d'erreur...
}; |
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:
1 2 3
|
#include "Error.h"
char* to_string(Error err); |
et string_utility.h qui fournit une fonction de conversion générique vers string.
Code:
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();
} |
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...
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
Code:
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; |
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 !
Mais comment fait-on en pur C++03 ? (et sans accès à boost)
Merci !