1. C++ / Говнокод #9294

    +1000

    1. 1
    2. 2
    3. 3
    QString dump_str = "dump";
    log4cplus::tstring tdump = (std::wstring((wchar_t*)dump_str.unicode(), dump_str.length()));
    XLogger::dumper = log4cplus::Logger::getInstance(std::wstring(tdump));

    Мой "шедевр"
    Три преобразования подряд
    Если кто подскажет как это по человечески приписать буду благодарен.

    Запостил: ir4y, 02 Февраля 2012

    Комментарии (15) RSS

    • В 4.7 уже есть QString::toStdWString
      ...getInstance(tdump.toStdWString()));

      ?
      Ответить
      • Действительно, работает.
        Спасибо.
        Ответить
    • Крестопроблемы в чистом виде.
      Иногда невстроенность строк сильно вредит.
      Ответить
      • почему никаких проблем у меня в моем коде не возникает, когда я делаю
        mylogger.error() << "Hello" << L"World" << std::endl;
        крестопроблемы не в туалетах, а в головах
        Ответить
        • Кто минусанул defecate-plusplus, поясни за что
          Ответить
          • очевидно, в кютэ религия запрещает использовать потоки и реализовать фасет std::codecvt

            по теме - не понимаю, в чем проблема сделать
            XLogger::dumper = log4cplus::Logger::getInstance(dump_str. toStdWString());
            хоть я и не знаю, что означают эти все конструкции - в первый раз вижу
            Ответить
        • Не знаю, может потому что есть удобные (но руками написанные) конвертёры между всеми использованными в этой строке кода типами строк.
          Ответить
          • нет, по той простой причине, что по требованию п. 27.6.2.1 стандарта 2003 года basic_ostream обязан определить operator << как для char const *, так и для charT const *
            т.е. ты можешь спокойно писать
            std::wcout << "Hello, " << L"World!" << std::endl;

            и всё выведется как положено

            в std::cout конечно wchar_t const * выводить не следует - оно об нем само по себе ничего не знает, но если очень хочется, то можно объявить перегрузку вывода std::wstring в чаровый ostream, и в этой перегрузке уже выводить собственным образом - например, тривиальным
            std::ctype<wchar_t> const & facet = std::use_facet<std::ctype<wchar_t> >(o.getloc());
            for (std::wstring::const_iterator i = ws.begin(); i != ws.end(); ++i) 
            	o << (facet.narrow(*i, '?'));
            return o;


            исходя из вышеизложенного, не вижу абсолютно никаких проблем для того, чтобы ихний логгер работал как говносраный поток, придуманный 15 лет назад, и был способен без лишнего геморроя для программиста воспринимать как однобайтовые строки, так и многобайтовые - это уже задача потока либо однобайтовые расширять до юникода, либо наоборот
            я сам реализовывал такой логгер, ничего сложного в нем нет
            Ответить
            • Эм,
              log4cplus::Logger::getInstance возвращает экземпляр логера а не пишет лог.
              Непосредственно запись осуществляется уже через стандартный интерфейс потоков.
              И там все работает нормально. Проблема только в методе getInstance.
              Ответить
    • В qt же вроде есть что-то для логов...
      Ответить
      • Встроенного механизма для логов с поддержкой ротации и т.п. нет =(
        Приходится использовать сторонние библиотеки
        Ответить
        • прелесть сторонних библиотек в их стороннести - хочу юзаю, хочу выкину
          Ответить
        • Перехватил вывод qDebug и делай с ним что хочешь, хоть на Луну отправляй
          Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий