Вопрос про мувы и пр
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.11.21 19:58
Оценка:
Здравствуйте!

Изучаю новые стандарты методом тыка и с вашей помощью, коллеги


Такой код:
  Скрытый текст
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
Не работает
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.