2016-06-06 1 views
-1

Je voudrais avoir une fonction qui ressemble à cout mais avec quelques options.Personnalisation de cout à partir d'une classe avec des options

Par exemple: MyFunc(0) << "Cats like to drink milk " << 2 << endl; lorsque son 0, il ne devrait pas y avoir de sortie

Lorsque son comme celui-ci:

MyFunc(1) << "Cats like to drink milk " << 2 << endl; 

je devrais voir la sortie "Les chats aiment boire milk2". J'ai lu de plusieurs forums que ostream doit être utilisé, mais je ne suis pas sûr de savoir comment je peux l'utiliser pour mon but. MyFunc est une classe fondamentalement, avec 1, 0 options au constructeur.

J'ai vu des choses comme ça, mais je ne comprends pas comment cela fonctionne.

Log& operator<< (std::ostream &(*f)(std::ostream &)){ 
cout << *f; 
return *this; 
} 

Toute aide appréciée.

+0

Avez-vous résolu l'une des parties les plus simples de ce problème? Comme écrire une classe qui agit comme «cout» sans être particulier sur le nombre? – Beta

+0

Eh bien, vous devriez généralement éviter d'hériter des objets dans l'espace de noms standard, mais je pourrais vous prévoir d'encapsuler 'std :: cout' et d'implémenter l'opérateur' '' pour tous les [mêmes types] (http: // fr .cppreference.com/w/cpp/io/basic_ostream/operator_ltlt). Quelque chose comme [ceci] (http://coliru.stacked-crooked.com/a/4970cbea5b144ec7) – AndyG

+0

@ AndyG, apprécié. Ce que je cherchais précisément! – user42826

Répondre

0

Il va essentiellement comme ceci:

class CoutPlus { 
public: 
    CoutPlus(int& i) : m_bOn(i) {} 
    template<class T> CoutPlus& operator<<(const T& val) { 
     if (m_bOn) 
      std::cout << val; 
     return *this; 
    } 
private: 
    bool m_bOn; 
}; 

Vous décidez quoi faire avec le constructeur vide et l'affectation, et si d'autres à mettre en œuvre les fonctions membres de ostream.