J'ai une classe similaire à boost :: any, en ce sens qu'il s'agit d'une classe de conteneur gabarit. Je voudrais avoir une méthode pour écrire la valeur contenue dans une chaîne. Toutefois, si le type contenu ne fournit pas d'opérateur d'insertion de flux, j'aimerais que ma méthode renvoie une requête par défaut plutôt que de ne pas compiler. Ci-dessous est aussi proche que je suis venu, et devrait préciser à ce que je suis en train de faire:Comment créer un opérateur d'insertion de flux "par défaut" en C++?
namespace W {
namespace hide {
template <typename T>
std::ostream& operator<<(std::ostream& out, const T& t) {
return std::operator<<(out, typeid(T).name());
}
}
template <typename T> struct C {
T t_;
std::string ToString() const {
using namespace hide;
std::ostringstream oss;
oss << t_;
return oss.str();
}
};
}
Cela fonctionne assez bien, avec quelques mises en garde. Par exemple, si je veux réellement fournir un opérateur d'insertion surchargé pour une classe, cet opérateur doit soit être dans le même espace de noms que la classe, soit être dans l'espace de noms W pour être considéré.
Il a également des problèmes avec tout type qui a déjà un opérateur std :: non-membre < <, par ex. char et std :: string. Si T est l'un de ces types, alors la ligne oss << t_
ci-dessus devient ambiguë. Cela peut être contourné en ajoutant pour ces types de surcharge à l'intérieur l'espace de noms W, par exemple:
std::ostream& operator << (std::ostream& out, const std::string& s) {
return std::operator <<(out, s);
}
Ma question est, quelqu'un trouve une meilleure méthode que cela? Pourquoi dois-je ajouter mes propres surcharges pour des choses comme std :: string? Est-ce que tout est pris en charge selon la norme, ou est-ce que je profite d'un comportement non standard? (Je teste avec g ++ 4.3.3)
Cela ne semble pas détecter mes propres opérateurs d'insertion de flux personnalisés. L'objet const & operator a la priorité, peut-être parce qu'il est déclaré comme faisant partie de la fonction? Si j'essaie d'extraire l'objet et son opérateur << de la fonction, il finit par ne plus pouvoir correspondre à quoi que ce soit ... – JimSteele1222
En fait, rayez cela: il récupère les opérateurs d'insertion de flux tant qu'ils sont dans le même espace de noms que le classe T. Je n'arrive pas à trouver un moyen, par exemple, de fournir un opérateur d'insertion de flux pour le vecteur. –
JimSteele1222