C ++
Это попытка создать класс, который имитирует выходное поведение использования <<
оператор ofstream
насколько можно использовать std::endl
и писать string
с обеспокоен. У класса есть один элемент данных, ofstream
указатель. В классе есть два перегруженных <<
операторы, тот, который занимает std::string
и другой, который принимает указатель на функцию, аргумент которой является ostream
ссылка и возвращает ostream
ссылка. Это подпись std::endl
, в соответствии с этот. Технически, нижеприведенная программа работает с заданным вводом. Он может печатать в файл, две строки текста, разделенные двумя std::endl
s. Тем не менее, я хочу, чтобы мой не-перегружен строковый параметр <<
оператор принять 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
чтобы сделать эту работу. Не уверен, что вы действительно хотите это сделать.
Насколько я знаю, нет способа заставить параметр быть конкретным значением во время компиляции.
Если принудительное выполнение во время компиляции не является обязательным требованием, вы можете использовать простое утверждение, подобное этому, чтобы убедиться, что параметр std::endl
:
assert(static_cast<std::ostream& (*) (std::ostream& os)>(&std::endl) == endlPar);