【发布时间】:2013-03-05 02:54:02
【问题描述】:
C++
这是一个尝试创建一个模拟使用ofstream 的<< 运算符的输出行为的类,就能够使用std::endl 和编写strings 而言。该类有一个数据成员,ofstream 指针。该类有两个重载的<< 运算符,一个采用std::string,另一个采用指向函数的指针,其参数是ostream 引用并返回ostream 引用。那是std::endl的签名,根据this。从技术上讲,以下程序适用于给定的输入。它能够打印到文件,两行文本由两个std::endls 分隔。但是,我希望我的 non-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.
【问题讨论】:
-
做这种事情的正确方法是创建一个
std::streambuf的派生类。
标签: c++ operator-overloading function-pointers ofstream endl