2010-11-06 8 views
1

J'ai besoin de surcharger l'opérateur < < pour que les flux fonctionnent avec les types intégrés. Pour les chaînes, il est pas un problème, puisque je simplement surcharger la fonction comme ceci:Surcharge en C++ << opérateur

ostream& operator<<(ostream& os, const char* str) { /*...*/ } 

Cela fonctionne parce que cette fonction est globale, pas membre. Le problème est que j'ai besoin de surcharger l'opérateur < < pour d'autres types primitifs (ints, floats, etc) mais ce sont des fonctions membres. Y a-t-il un moyen de le faire? J'en ai besoin pour travailler non seulement avec cout, mais aussi avec d'autres flux. Merci d'avance.

+5

Je ne sais pas ce que vous entendez ... 'operator <<' * existe déjà * pour les types 'ostream &' et built-in. Pas besoin de le surcharger. Idem pour 'const char *'. –

+0

vous voulez dire, vous devez avoir 2 fonctions surchargées pour <<. Un global et un membre. Cependant, les paramètres diffèrent [global pour les types de chaîne et la fonction de membre pour les autres types de données]. Droite ??? –

+1

Je sais qu'il y a déjà une surcharge pour ostream &. Mais je dois le surcharger parce que j'en ai besoin pour me comporter différemment (pas simplement pour imprimer les caractères). – Mirko

Répondre

6

Vous ne devriez pas essayer de changer ce que fait l'opérateur dans std::cout << 3;. Cela fait partie d'une API standard. Si vous avez besoin de sortie dans un format qui Manipulateurs de flux ne peuvent pas supporter, alors, par exemple, vous pouvez écrire un petit emballage:

struct MyFormatter { 
    MyFormatter (ostream &o) : o(o) {} 
    ostream &o; 
}; 

MyFormatter &operator<<(MyFormatter &mf, int i) { 
    mf.o << "int(" << i << ")"; // or whatever 
    return mf; 
} 

ensuite l'utiliser comme ceci:

MyFormatter mf(std::cout); 
mf << 1 << "," << 2 << "," << 3; 
+0

Merci pour la réponse Steve. Vous avez mentionné que je ne devrais pas changer l'opérateur << pour cout. Le problème est que je devrais faire exactement cela. C'est un devoir. La tâche consiste à écrire un programme basé sur des manipulateurs qui inversent le contenu entre des balises spécifiques. Exemple: cout << début << "abc" << fin. Maintenant, la chaîne "abc" devrait être imprimée "cba". "start" et "end" seront des manipulateurs mais je dois encore surcharger l'opérateur << pour que cela fonctionne. Maintenant, je l'ai fait avec des cordes avec succès, mais j'ai des problèmes avec d'autres types primitifs. – Mirko

+1

@Mirko: Je ne pense pas que vous pouvez le faire strictement avec des manipulateurs. Un manipulateur est une fonction (ou un objet semblable à une fonction) qui, lorsqu'elle est écrite dans un flux, est appelée avec ce flux en tant que paramètre. Tout ce qu'ils peuvent faire est de définir l'état sur le flux, et 'cout' n'a que certains drapeaux de format et ainsi de suite disponibles pour être manipulés. Je soupçonne que ce que vous voulez, c'est d'avoir 'cout << start', non pas' cout', mais un wrapper. Mais sans avoir vu la mission, je ne suis pas sûr, j'ai peut-être raté quelque chose. –

+1

Quoi qu'il en soit, je suis sûr que vous ne pouvez pas * fournir * une surcharge pour 'operator << (ostream &, int)', car il serait ambigu avec la surcharge existante. –