Как написать функцию, чтобы можно было писать qDebug() << “hello”;

222
14 апреля 2019, 06:20

Я не пойму как можно определить функцию, чтобы можно было писать такое:

qDebug() << "hello world";

В данном примере надо как-то определить функцию qDebug(), но как? Если можно, то ответ кодом напишите.

Answer 1

Такая функция возвращает объект, к которому применим operator<<. Простейшим способом написать аналог будет такой:

std::ostream& debug()
{
    return std::cout;
}

И это можно использовать как у Вас в примере:

debug() << "Hello!";

qDebug() может быть реализована схожим образом (но реально это макрос, который несколько по-другому реализован), просто возвращать ссылку на объект QDebug, а не std::ostream.

Answer 2

Помимо уже сказанного про применимость operator<< к результату qDebug(), у класса QDebug (возвращаемый из макроса qDebug) есть ещё одна особенность, заключающаяся в автоматическом переводе курсора вывода на новую строку, т.е. нет явной необходимости добавлять '\n' в конце. С одной стороны это удобно, с другой - несколько раздражает. А реализовано это через обычный деструктор класса, который вызывается при уничтожении объекта QDebug, который создаётся каждым новым вызовом qDebug(). Вариант реализации:

#include <iostream>
struct D {
    ~D() { std::cout << "\n"; }
    template <typename T>
    D& operator<< (const T& t) 
    {
        std::cout << t << " ";
        return *this;
    }    
};
D deb() { return D(); }
int main()
{
    deb() << 42 << "string" << 100.5;
}
READ ALSO
Передача массива строк в метод

Передача массива строк в метод

я создал прототип метода

204
Ошибка при загрузки библиотеки All com.android.support libraries must use the exact same version specification

Ошибка при загрузки библиотеки All com.android.support libraries must use the exact same version specification

При попытки добавить библиотеку для рекламы от adMob

186
Логгирование в разные файлы в Spring Boot

Логгирование в разные файлы в Spring Boot

Нужно вести логи приблизительно таким образом:

279