Surcharge stream operator

Résolu
Joan_Andre Messages postés 8 Date d'inscription jeudi 6 septembre 2007 Statut Membre Dernière intervention 3 mars 2009 - 26 févr. 2009 à 22:09
Joan_Andre Messages postés 8 Date d'inscription jeudi 6 septembre 2007 Statut Membre Dernière intervention 3 mars 2009 - 3 mars 2009 à 15:27
Bonjour,

Quelqu un pourrait il m expliquer la raison pour laquelle le code ci dessous ne fonctionne pas (je ne parviens pas a faire "entrer" le std::end dans le streaming. J ai aussi essaye avec ostream& comme argument d operator).

Merci d avance.

#include

#include <string>

using namespace std;

class OutClasse

{

public:

OutClasse& operator << (string);

OutClasse& operator << (int);

OutClasse& operator << (ostream);

};

OutClasse& OutClasse::operator << (string sChaine)

{

std::cout << sChaine;

return *this;

};

OutClasse& OutClasse::operator << (int sChaine)

{

std::cout << sChaine;

return *this;

};

OutClasse& OutClasse::operator << (ostream sChaine)

{

std::cout << sChaine;

return *this;

};

main()

{

OutClasse a;

a << "salut" << std::endl;

}

4 réponses

cptpingu Messages postés 3840 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 23 août 2024 126
1 mars 2009 à 01:35
Il faut savoir que std::endl n'est pas une constante, mais une fonction templaté, donc tu peux essayer ceci:

#include
#include <sstream>

class OutClasse
{
public:
  OutClasse& operator<<(const std::string& sChaine);
  OutClasse& operator<<(int sChaine);
  OutClasse& operator<< (std::ostream& sChaine);
};

OutClasse&
OutClasse::operator<<(const std::string& sChaine)
{
  std::cout << sChaine;

  return *this;
};

OutClasse&
OutClasse::operator<<(int sChaine)
{
  std::cout << sChaine;
  return *this;
};

OutClasse&
OutClasse::operator<< (std::ostream& sChaine)

{
  std::cout << sChaine;

  return *this;
};

OutClasse&
operator<<(OutClasse& out,
       std::ostream& (*fn)(std::ostream&))
{
  std::ostringstream oss;
  fn(oss);
  out << oss.str();
  return out;
}

int
main()
{
  OutClasse a;
  a << "salut" << std::endl;
}
3
Joan_Andre Messages postés 8 Date d'inscription jeudi 6 septembre 2007 Statut Membre Dernière intervention 3 mars 2009
2 mars 2009 à 15:36
Merci, c est vraiment la solution a mon probleme. Je n aurais vraiment pas pu imaginer cela tout seul.

Histoire de ne pas me laisser porter mais d essayer de comprendre l information que je viens de recevoir, une idee de lecture pour m aider a hisser mes connaissances a ce niveau ? Je pense avoir lu la litterature standard necessaire pour etre << serieux >> en C++ mais la, il semble qu il y a une specialite (certainement plusieurs) qui me fait defaut.

Merci encore.
0
cptpingu Messages postés 3840 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 23 août 2024 126
2 mars 2009 à 17:18
Lorsque tu fais un :
std::endl, il devine tout seul les templates nécessaires, et te met automatiquement un: std::endl<char, char_traits<char> >.
Comme un endl est une fonction templaté, pour qu'il accepte de le prendre en argument de operator<<, j'ai dit à operator de prendre un pointeur sur fonction, dont la signature pourrait correspondre à std::endl.

Maintenant, bien que cette solution fonctionne, quelques remarques:
- std::endl est à manier avec précaution. std::endl équivaut à: '\n' << std::flush
Ce qui peut nuire au preformance. Un simple '\n' est donc souvent à préconiser.
- std::endl peut être remplacer pour éviter cela. Par exemple avec un std::nl (fait maison :p):

namespace std
{
  template <class charT, class traits>
  basic_ostream<charT, traits>&
  nl(basic_ostream<charT, traits>& os)
  {
#ifdef __WIN32__
    os << "\r\n";
#else
    os << '\n';
#endif
    return os;
  }
}

int main()
{
  OutClasse a;
  a << "salut" << std::nl;
}
0
Joan_Andre Messages postés 8 Date d'inscription jeudi 6 septembre 2007 Statut Membre Dernière intervention 3 mars 2009
3 mars 2009 à 15:27
Bon, visiblement il faut que j etudie serieusement les << basic template member >> d une part et les << traits mechanisms >> d autre part. Ca me dit quelque chose mais cela doit faire tres longtemps...

En tout cas merci. Non seulement, mon probleme specifique est resolu mais en plus j ai un bon point de depart pour cerner mes lacunes et y remedier.
0
Rejoignez-nous