Je souhaite fournir une fonction de modèle qui convertit la plupart des types de base en chaîne. Le meilleur que je suis venu avec à ce jour est la suivante:Existe-t-il une fonction de modèle sans avertissement pour convertir les types de base en chaîne
template<typename T> inline std::string anyToString(const T& var) {
std::ostringstream o;
o << var;
return o.str();
}
La fonction peut par exemple être utilisé pour les éléments suivants:
class TimeError:public std::runtime_error{
public:
explicit TimeError(int time):std::runtime_error(anyToString(time)),
mTime(time){};
protected:
int mTime;
};
Le problème avec anyToString et des fonctions similaires est la génération d'avertissements d'ambiguïté lors de la compilation avec gcc version 4.4.3 -Wall -Wexta -Werror "ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second
"
A ma connaissance la raison de l'avertissement réside dans les possibilités de conversion implicite lors de l'appel < <
Ces ambiguïtés sont principalement générées par d'autres modèles comme suit:.
template<typename T>
T& operator<<(T& out, const SymRad& angle){
return out << angle.deg();
}
Mais ceux-ci ont d'autres avantages comme travailler pour plusieurs types de flux. Alors j'aimerais les garder. Si je transforme le deuxième modèle en une méthode simple, par ex. ostream l'ambiguïté est nettoyée, mais je cherche sth. Cela permet de garder les deux modèles. Existe-t-il une fonction générique qui offre la même simplicité sans générer d'avertissement à l'aide des options décrites? Si non, quelle est la meilleure façon de localement désactiver l'avertissement émis?
Hmm. Pouvez-vous ajouter un exemple de la façon dont vous utilisez ce modèle? –
@Oli Charlesworth: a ajouté un exemple pour l'utilisation – Martin
@Martin, de quelles options parlez-vous lorsque vous dites "ces options"? –