我在尝试实现自定义流类以在输出文件中生成很好的缩进代码时遇到了一些麻烦。我在网上进行了广泛的搜索,但似乎没有就实现这一目标的最佳方式达成共识。有些人谈论派生流,其他人谈论派生缓冲区,还有一些人建议使用语言环境/构面等。
本质上,我发现自己写了很多这样的代码:
ofstream myFile();
myFile.open("test.php");
myFile << "<html>" << endl <<
"\t<head>" << endl <<
"\t\t<title>Hello world</title>" << endl <<
"\t</head>" << endl <<
"</html>" << endl;
当标签开始加起来时看起来很可怕,似乎有这样的东西会很好:
ind_ofstream myFile();
myFile.open("test.php");
myFile << "<html>" << ind_inc << ind_endl <<
"<head>" << ind_inc << ind_endl <<
"<title>Hello world</title>" << ind_dec << ind_endl <<
"</head>" << ind_dec << ind_endl <<
"</html>" << ind_endl;
即创建一个派生流类,它会跟踪其当前的缩进深度,然后是一些操纵器来增加/减少缩进深度,以及一个操纵器来编写一个换行符,然后是许多制表符。
所以这是我实现类和操纵器的方法:
ind_ofstream.h
class ind_ofstream : public ofstream
{
public:
ind_ofstream();
void incInd();
void decInd();
size_t getInd();
private:
size_t _ind;
};
ind_ofstream& inc_ind(ind_ofstream& is);
ind_ofstream& dec_ind(ind_ofstream& is);
ind_ofstream& endl_ind(ind_ofstream& is);
ind_ofstream.cpp
ind_ofstream::ind_ofstream() : ofstream() {_ind = 0;}
void ind_ofstream::incInd() {_ind++;}
void ind_ofstream::decInd() {if(_ind > 0 ) _ind--;}
size_t ind_ofstream::getInd() {return _ind;}
ind_ofstream& inc_ind(ind_ofstream& is)
{
is.incInd();
return is;
}
ind_ofstream& dec_ind(ind_ofstream& is)
{
is.decInd();
return is;
}
ind_ofstream& endl_ind(ind_ofstream& is)
{
size_t i = is.getInd();
is << endl;
while(i-- > 0) is << "\t";
return is;
}
这会构建,但不会产生预期的输出;任何使用自定义操纵器的尝试都会导致它们由于某种原因被转换为布尔值并将“1”写入文件。我需要为我的新类重载 << 运算符吗?(我还没有找到一种可以构建的方法)
谢谢!
ps
1) 我从我的代码片段中省略了#includes、使用命名空间等以节省空间。
2)我的目标是能够使用类似于我的第二个代码片段中的界面。如果在阅读整篇文章后,您认为这是一个坏主意,请解释原因并提供替代方案。