Как правильно реализовать C++ потоковый манипулятор endl?
Я пытаюсь реализовать манипулятор для моего stream
учебный класс. Я не очень разбираюсь в манипуляторах, но думаю, что все делаю правильно. Соответствующие части кода ниже:
class stream
{
public:
stream& operator<<(bool b) { // send bool value and return *this; }
stream& operator<<(const char str[]) { // send string and return *this }
};
inline stream& endl(stream& s)
{
return s << "\r\n";
}
class stream stream;
int main()
{
stream << endl;
}
Я не знаю, что я делаю не так, но вместо звонка endl
компилятор вызывает stream::operator<<(bool)
, Любая идея?
2 ответа
Проводы stream << endl;
компилятор должен выбрать перегрузку из operator <<
Вы предоставили. endl
не конвертируется в const char *
, но он конвертируется в bool
так вот что ты получаешь.
Вы, вероятно, хотели добавить перегрузку
stream& operator<<(stream &(*function)(stream &)) {
return function(*this);
}
Внутри class stream
это правильно обрабатывает указатели функций.
Так как ваш endl
не является bool
ни const char[]
(это бесплатная функция), она неявно преобразуется в bool
(true
) и вызывается следующая функция:
stream::stream& operator<<(bool b)
Вы могли бы определить endl
быть особого типа endl_t
и определить правильный оператор для него:
#include <iostream>
#include <string>
#include <array>
//Just make the operators `explicit`. See [this excellent answer on SO](http://stackru.com/a/8239402/5470596).
class stream
{
public:
stream& operator<<(bool b) { std::cout << "bool\n" ; return *this; }
stream& operator<<(const char str[]) { std::cout << "const char[]\n" ; return *this; }
};
struct endl_t {} endl;
stream& operator<<(stream& s, endl_t)
{
s << "\r\n";
return s;
}
int main()
{
stream s;
s << endl; // prints "const char[]"
}