Использование класса-оболочки ofstream * с перегруженным тегом & lt; & lt; оператор на конце

C ++

Это попытка создать класс, который имитирует выходное поведение использования << оператор ofstreamнасколько можно использовать std::endl и писать stringс обеспокоен. У класса есть один элемент данных, ofstream указатель. В классе есть два перегруженных << операторы, тот, который занимает std::string и другой, который принимает указатель на функцию, аргумент которой является ostream ссылка и возвращает ostream ссылка. Это подпись std::endl, в соответствии с этот. Технически, нижеприведенная программа работает с заданным вводом. Он может печатать в файл, две строки текста, разделенные двумя std::endls. Тем не менее, я хочу, чтобы мой не-перегружен строковый параметр << оператор принять 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.

0

Решение

Если я смотрю на мой заголовочный файл 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 чтобы сделать эту работу. Не уверен, что вы действительно хотите это сделать.

2

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

Насколько я знаю, нет способа заставить параметр быть конкретным значением во время компиляции.
Если принудительное выполнение во время компиляции не является обязательным требованием, вы можете использовать простое утверждение, подобное этому, чтобы убедиться, что параметр std::endl:

assert(static_cast<std::ostream& (*) (std::ostream& os)>(&std::endl) == endlPar);
1

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