Как создать Endl манипулятор для моего класса?

Мой класс выглядит так:

class FileOut
{
private:
std::ofstream stream;
public:
FileOut(string sciezka);
~FileOut(void);

friend FileOut & operator<< (FileOut & obiekt, const char* w);
friend FileOut & operator<< (FileOut & obiekt, const string & w);
friend FileOut & operator<< (FileOut & obiekt, const char & znak);
friend FileOut & operator<< (FileOut & obiekt, const int & liczba);
friend FileOut & operator<< (FileOut & obiekt, const double & liczba);
friend FileOut & operator<< (FileOut & obiekt, std::endl);
//friend FileOut & endl (FileOut & obiekt);
};

operator<< прекрасно работает со строками, символами, int и т. д. stream).
Я хочу реализовать манипулятор endl для моего класса. Обычно мы переопределяем это так:

ostream & endl (ostream & os){ return os << '\n'; }

но это не сработает для моего класса. Я объявил

friend FileOut & endl (FileOut & obiekt);

но это не работает Как я могу сделать это, чтобы иметь возможность написать:

FileOut save("file.txt");
save<<"tralalala"<<endl<<1123;

???

1

Решение

Поскольку std :: eol на самом деле является шаблоном функции типа, совместимого с ostream& (*fctr) (ostream&)необходимо перегрузить следующий оператор:

class FileOut
{
//...
friend FileOut & operator<< (FileOut & obiekt, ostream& (*fctr) (ostream&))
//...
};

Внутри перегрузки вам нужно убедиться, что fctr действительно соответствует eol (это может быть eof, tab или любой манипулятор, соответствующий сигнатуре), а затем записать все, что вы хотите записать в файл на eol:

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

class FileOut
{
private:
std::ofstream stream;
public:
FileOut(std::string sciezka):stream(sciezka) {};
~FileOut(void){};

friend FileOut & operator<< (FileOut & obiekt, const char* w) {obiekt.stream<<w;return obiekt;} ;
friend FileOut & operator<< (FileOut & obiekt, const string & w);
friend FileOut & operator<< (FileOut & obiekt, const char & znak);
friend FileOut & operator<< (FileOut & obiekt, const int & liczba){obiekt.stream<<liczba;return obiekt;};
friend FileOut & operator<< (FileOut & obiekt, const double & liczba);
friend FileOut & operator<< (FileOut & obiekt, ostream& (*pf) (ostream&));
//friend FileOut & endl (FileOut & obiekt);
};

FileOut & operator<< (FileOut & obiekt, ostream& (*pf) (ostream&))
{
if(pf==&std::endl)
{
obiekt.stream<<"MY FAT JUICY EOL";
}

return obiekt;
}

int main(int argc, char* argv[])
{
FileOut save("file.txt");

save<<"tralalala"<<endl<<1123;
return 0;
}
2

Другие решения

В качестве альтернативы, если вам не нравится использовать std :: eol и вы хотите свой собственный:

#include <fstream>
#include <string>
#include <iostream>

using namespace std;

class FileOut
{
private:
std::ofstream stream;
public:
FileOut(std::string sciezka):stream(sciezka) {};
~FileOut(void){};

friend FileOut & operator<< (FileOut & obiekt, const char* w) {obiekt.stream<<w;return obiekt;} ;
friend FileOut & operator<< (FileOut & obiekt, const string & w);
friend FileOut & operator<< (FileOut & obiekt, const char & znak);
friend FileOut & operator<< (FileOut & obiekt, const int & liczba){obiekt.stream<<liczba;return obiekt;};
friend FileOut & operator<< (FileOut & obiekt, const double & liczba);
friend FileOut & operator<< (FileOut & obiekt, void (*pf) ());

static void eol() {};
//friend FileOut & endl (FileOut & obiekt);
};

FileOut & operator<< (FileOut & obiekt, void (*pf) ())
{
if(pf == FileOut::eol)
{
obiekt.stream<<"MY FAT JUICY STATIC EOL";
}

return obiekt;
}

int main(int argc, char* argv[])
{
FileOut save("file.txt");

save<<"tralalala"<<FileOut::eol<<1123;
return 0;
}
1

По вопросам рекламы [email protected]