Здравствуйте!
Изучаю новые стандарты методом тыка и с вашей помощью, коллеги
Такой код:
| Скрытый текст |
| class myQtLog
{
QtMsgType m_msgType;
QString m_str;
QTextStream m_stream;
public:
myQtLog(QtMsgType msgType = QtInfoMsg) // { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtSystemMsg }
: m_msgType(msgType)
, m_str()
, m_stream()
{
m_stream.setString(&m_str);
}
myQtLog() = delete;
myQtLog( const myQtLog &) = delete;
myQtLog(myQtLog&&) = default;
myQtLog& operator=(const myQtLog &scopeExec) = delete;
~myQtLog()
{
m_stream.flush();
switch( m_msgType )
{
case QtDebugMsg : qDebug ("%s\n", qUtf8Printable(m_str)); break;
case QtInfoMsg : qInfo ("%s\n", qUtf8Printable(m_str)); break;
case QtWarningMsg : qWarning ("%s\n", qUtf8Printable(m_str)); break;
case QtCriticalMsg: qCritical("%s\n", qUtf8Printable(m_str)); break;
case QtFatalMsg : qFatal ("%s\n", qUtf8Printable(m_str)); break;
default: // QtSystemMsg?
qInfo ("[!SYSTEM!] %s\n", qUtf8Printable(m_str)); break;
}
}
myQtLog& operator<<(QChar c) { m_stream<<c; return *this; }
myQtLog& operator<<(char c) { m_stream<<c; return *this; }
myQtLog& operator<<(short i) { m_stream<<i; return *this; }
myQtLog& operator<<(unsigned short i) { m_stream<<i; return *this; }
// ...
}; // myQtLog
class myQtLogStream
{
QtMsgType m_msgType;
myQtLog mkLog() { return myQtLog(m_msgType); } // { return myQtLog(m_msgType); }
public:
myQtLogStream(QtMsgType msgType = QtInfoMsg) // { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg, QtSystemMsg }
: m_msgType( msgType )
{}
myQtLogStream( const myQtLogStream & ) = default;
myQtLogStream& operator=( const myQtLogStream& ) = default;
myQtLog operator<<(QChar c) { return std::move( mkLog()<<c); } // { return mkLog()<<c; } // !!! attempting to reference a deleted function
myQtLog operator<<(char c) { return std::move( mkLog()<<c); } // { return mkLog()<<c; }
myQtLog operator<<(short i) { return std::move( mkLog()<<i); } // { return mkLog()<<i; }
myQtLog operator<<(unsigned short i) { return std::move( mkLog()<<i); } // { return mkLog()<<i; }
}; // class myQtLogStream
//!!! Первая версия
/*
inline myQtLog myQtDebug () { return myQtLog(QtDebugMsg ); }
inline myQtLog myQtInfo () { return myQtLog(QtInfoMsg ); }
inline myQtLog myQtWarning () { return myQtLog(QtWarningMsg ); }
inline myQtLog myQtCritical() { return myQtLog(QtCriticalMsg); }
inline myQtLog myQtFatal () { return myQtLog(QtFatalMsg ); }
*/
extern myQtLogStream tkfDebug ;
extern myQtLogStream tkfInfo ;
extern myQtLogStream tkfWarning ;
extern myQtLogStream tkfCritical;
extern myQtLogStream tkfFatal ;
//----------------------------------------------------------------------------
// lib.cpp
myQtLogStream myQtDebug = myQtLogStream(QtDebugMsg );
myQtLogStream myQtInfo = myQtLogStream(QtInfoMsg );
myQtLogStream myQtWarning = myQtLogStream(QtWarningMsg );
myQtLogStream myQtCritical = myQtLogStream(QtCriticalMsg);
myQtLogStream myQtFatal = myQtLogStream(QtFatalMsg );
//----------------------------------------------------------------------------
// main.cpp
mtQtInfo << 'Y';
|
| |
Кутишные логи показались неудобными, и способ записи разнотипных сообщений там отличается
Решил обернуть. Сначала написал myQtLog и использовал inline функции, помеченные "//!!! Первая версия"
Работало.
Решил избавится от скобочек при вызове лого-потока, и сделать глобальные объекты типа std::cout, доколбасил myQtLogStream
Не работает