Mon objectif est de concevoir une classe String qui décore std::string afin de fournir certaines fonctionnalités dont mon programme a besoin. L'une des fonctionnalités que je souhaite ajouter est la possibilité de convertir implicitement n'importe quoi en String afin d'économiser de la frappe.
Afin de réaliser la conversion implicite, j'ai conçu la classe suivante :
std::ostream& operator<<(std::ostream& o, const String& s);
class String {
public:
template<typename t_value>
String::String(t_value value) {
std::ostringstream oss;
oss << value;
_str = oss.str();
}
private:
std::string _str;
}
Cela fonctionne bien avec tous les types qui ont l'attribut <<
opérateur défini. Le problème est apparu avec toute classe qui n'a pas l'opérateur de flux. Une erreur de compilation serait acceptable, mais ce que j'ai obtenu est une récursion à l'infini puisque le C++ essaie d'utiliser ma classe globale <<
pour essayer de le convertir en mon type String.
Mon objectif principal est de coder comme ceci
class Foo {
int _memberWithUnderscoreInName;
}
String s = Foo();
Et obtenir une erreur de compilation au lieu d'une boucle infinie dans le constructeur.
Existe-t-il une solution simple pour cela ?