C++
这是尝试创建一个模拟使用 <<
的输出行为的类ofstream
的运算符(operator),只要能够使用 std::endl
然后写string
s有关。该类有一个数据成员,ofstream
。指针。该类有两个重载 <<
运算符,需要一个 std::string
另一个接受指向函数的指针,其参数是 ostream
。引用并返回 ostream
引用。那就是std::endl
的签名, 根据 this .从技术上讲,以下程序适用于给定的输入。它能够打印到文件,两行文本由两个分隔 std::endl
秒。但是,我希望我的非-string 参数重载 <<
接线员接受std::endl
只有,而不是仅仅匹配其签名的东西。我尝试了放置 std::endl
的各种组合在参数列表中,有和没有 *
有和没有&
,但我遇到了每种组合的编译器错误。也欢迎 C++11 的回答。
#include <fstream>
#include <iostream>
#include <string>
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 << "Enter filename: ";
std::string filename;
std::cin >> filename;
std::ofstream myofstream(filename.c_str());
TextOut myTextOut(&myofstream);
myTextOut << "Hello," << std::endl << std::endl << "spacious world.";
return 0;
}
输出:
Hello,
spacious world.
最佳答案
如果我查看我的 ostream 头文件,我会看到 endl
:
template<typename _CharT, typename _Traits> inline basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT, _Traits>& __os)
{
return flush(__os.put(__os.widen('\n')));
}
因此看起来您需要继承 basic_ostream
才能完成这项工作。不确定您是否真的想这样做。
关于c++ - 在 endl 上使用带有重载 << 运算符的 ofstream* 包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215010/