Продолжайте добавлять [в поток] в цикл for без доступа к локальной переменной - PullRequest
0 голосов
/ 05 апреля 2019

Представьте, что у вас есть следующий код, где logDebug() стоит дорого или не подходит для вызова более одного раза:

QDebug d = logDebug();
d << __FUNCTION__ << ":";
d << "positions separated with \" --- \":";
for (const auto& str : positions)
{
    d << "---" << str;
}

Макрос (просто для правильного замены имени функции) уже существует, который заменяетпервые 2 строки:

#define LOG_FUNCTION  this->logDebug() <<  __FUNCTION__ << ":"

Создает локальную переменную, вызывая logDebug().После вызова вы можете использовать только operator<< в макросе.Проблема в том, что вы не можете прикрепить тело цикла for к логгеру.

Q: Есть ли способ, которым я мог бы использовать макрос для вставки всех позиций (без повторного вызова logDebug?можно использовать лямбды, но я не знаю, как это сделать. Пожалуйста, помогите, самый короткий ответ победит!

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Ну, макрос может быть принудительно возвращен ваш объект отладки:

#define LOG_FUNCTION()  this->logDebug() <<  __FUNCTION__ << ":"

Затем используйте его так:

auto& d = LOG_FUNCTION();
d << "positions separated with \" --- \":";
for (const auto& str : positions)
{
    d << "---" << str;
}
1 голос
/ 05 апреля 2019

В: Есть ли способ, которым я мог бы использовать макрос для вставки всех позиций (без повторного вызова logDebug? Я думаю, это возможно с помощью лямбд, но я совершенно не знаю, как это сделать.

Полагаю, это возможно с чем-то следующим (используется std::cout вместо logDebug())

#include <iostream>

#define LOG_FUNCTION  std::cout << __FUNCTION__ << ": "

#define LOG_DEB(ps) \
    [](auto & s, auto const & _ps) { for ( auto const & p : _ps ) s << p; } \
    (LOG_FUNCTION, ps)

int main ()
 {
   int  a[] { 0, 1, 2, 3, 4 };

   LOG_DEB(a);
 }

Я использовал пару auto в качестве типов лямбда-аргументов, и это работает только начиная с C ++ 14.

В C ++ 11 их нужно заменить на правильные типы.

...