Приложение имеет систему ведения журнала, которая позволяет включать или отключать функции ведения журнала своих модулей во время выполнения. Команды журнала принимают потоки на входе (что является безопасной альтернативой «sprintf», вряд ли существует более неприятная ситуация, чем если причиной является ваша система отладки.Короткое замыкание потока
Проблема в том, что если я выполняю такие вещи, как:
logger.Trace << "Requests pending:" << buffer.findRequests();
и findRequests()
обладает высокой вычислительной сложности, даже если отключить уровень журнала трассировки для модуля, поиск будет выполняться (при сборке потока), прежде чем он отклонен внутри метода трассировки operator<<
.
очевидный альтернативой было бы засорять код:
if(logger.Trace.Enabled()) logger.Trace << ...
Это некрасиво, и это не удобно. Я мог бы заменить его с помощью макроса с помощью if
, или тот, который использует &&
короткое замыкание, будучи несколько лучше (может быть использована в качестве RValue, который следующий поток философия возвращает BOOL ложны на инвалидах потока):
#define TRACE if(logger.Trace.Enabled()) logger.Trace
#define TRACE dummyLogVar = logger.Trace.Enabled() && logger.Trace
Ни в особенно красивой или безопасной. Коллега предложил закрытия:
logger.Trace([&](f){f << "Requests pending:" << buffer.findRequests();});
.Trace
оценки будет закрытие, только если этот уровень включен. Логично, это приятно, но синтаксически абсолютно ужасно. Набрав этот беспорядок: logger.Trace([&](f){f <<
... ;});
сотни раз?
Есть ли более аккуратный, безопасный и удобный способ предотвращения оценки потока?
Я думаю, что закрытие - это единственный способ. Я должен был решить эту же проблему до введения замыканий, и я снова вернулся к макросам и вызовам функций в стиле C. –
_ «Логично, это приятно, но синтаксически абсолютно ужасно». Хе-хе приветствую C++ –
@LightnessRacesinOrbit: Будьте счастливы, я не использовал '<:&:>' для закрытия. Наткнулся на этот вчерашний день, озадачил меня на некоторое время. В действительности '<:' является орграфом для '['. Кто в наши дни все еще использует орграфы и почему? И почему в мире C++ 11 расширил набор орграфов и триграфов ?! Кто-то неправильно понял «встроенное программирование» и использует телефон Android с сенсорной клавиатурой для написания приложений для ПК? –