Как правильно реализовать 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[]"
}

Жить на колиру

Другие вопросы по тегам