Utilisation de la classe wrapper ofstream * avec l’opérateur << surchargé << sur endl

C ++

Il s’agit d’une tentative visant à créer une classe qui imite le comportement de sortie consistant à utiliser l’opérateur << d’un opérateur ofstream , dans la mesure où il est possible d’utiliser std::endl et write ssortingng s. La classe a un seul membre de données, le pointeur ofstream . La classe a deux opérateurs << surchargés, un qui prend un std::ssortingng et un autre qui prend un pointeur sur une fonction, dont l’argument est une référence ostream et retourne une référence ostream . C’est la signature de std::endl , selon cela . Techniquement, le programme ci-dessous fonctionne avec l’entrée donnée. Il est capable d’imprimer dans un fichier, deux lignes de texte séparées par deux std::endl s. Cependant, je veux que mon opérateur non- ssortingng surchargé de paramètre << accepte uniquement std::endl , pas quelque chose qui correspond simplement à sa signature. J’ai essayé diverses combinaisons de placement de std::endl dans la liste d’arguments, avec et sans * et avec et sans & , mais j’ai des erreurs de compilation pour chaque combinaison. Les réponses C ++ 11 sont également les bienvenues.

 #include  #include  #include  class TextOut { public: TextOut(std::ofstream* ofsPar) : ofs(ofsPar) {} TextOut& operator<<(std::string s) { *ofs << s; return *this; } TextOut& operator<<(std::ostream& (*endlPar) (std::ostream& os)) { *ofs << std::endl; return *this; } private: std::ofstream* ofs; }; int main() { std::cout <> filename; std::ofstream myofstream(filename.c_str()); TextOut myTextOut(&myofstream); myTextOut << "Hello," << std::endl << std::endl << "spacious world."; return 0; } 

Sortie:

 Hello, spacious world. 

Si je regarde mon fichier d’en-tête ostream, je vois ceci pour endl :

 template inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os) { return flush(__os.put(__os.widen('\n'))); } 

il semble donc que vous deviez hériter de basic_ostream pour que cela fonctionne. Pas sûr que tu veuilles vraiment faire ça.

Autant que je sache, il n’y a aucun moyen d’imposer à un paramètre d’être une valeur spécifique au moment de la compilation.
Si l’application au moment de la compilation n’est pas une exigence, vous pouvez utiliser une simple assertion comme celle-ci pour imposer que le paramètre est std::endl :

 assert(static_cast(&std::endl) == endlPar);