QDebug-подобная структура: определить конец ввода с помощью `operator <<` - PullRequest
4 голосов
/ 14 января 2012

Qt имеет хорошую функцию отладки, которая называется так

qDebug() << first_qobject << second_qobject;

создает строку с некоторыми "стандартными для строки" объектами и - и это важная часть - печатает \n и выпускает пар после second_object Я хочу воспроизвести это поведение по соглашению, согласно которому все мои классы имеют метод std::string to_string(), который я вызываю:

struct myDebug{
   template<typename T>
   myDebug& operator<<(T t){
       std::cout << t.to_string() << " "; // space-separated
       return *this;
   }
};

struct Point{
    std::string to_string(){ return "42"; }
};

myDebug() << Point() << Point(); // should produce "42 42" plus a newline (which it doesn't)

Теперь у меня вопрос: есть ли способ узнать, что после возврата *this во второй раз возвращаемый объект больше не вызывается? Так что я могу распечатать std::endl? qDebug(), кажется, может это сделать.

1 Ответ

2 голосов
/ 14 января 2012

Нашел решение и обнаружил, что мой вопрос тоже дубликат:

Как работает QDebug () << stuff;добавить новую строку автоматически? </a>

Короче говоря, это можно сделать, реализовав деструктор и просто создав временные MyDebug объекты, как я делал это в приведенном выше коде, а qDebug делает это:

MyDebug() << foo << bar;
// will be destroyed after passing bar, and in the destructor I can now flush.
...