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);