Я определил класс Debug
(аналогично qDebug
из Qt) с operator<<
для потоковой передачи данных в stdout
.
В соответствии с его параметром шаблона (который, в свою очередь, будет зависетьв макросе DEBUG
) Debug
будет специализированным: operator<<
специализации будет печатать данные, тогда как другая специализация будет тихой.
Ниже приводится тихая версия:
template< bool quiet = true >
class _Debug
{
public:
template< typename T >
_Debug& operator<<( const T & )
{
return *this;
}
};
Я заметил, однако, что параметры для operator<<
будут оцениваться, даже если это тихая версия:
Debug<1>() << "Var " << var.name();
Я могу видеть с помощью профилировщика, что при запуске вышеупомянутой частикода, выражения "Var"
и var.name()
оцениваются, даже если Debug<1>
является тихой специализацией _Debug
.
Есть ли способ избежать этого?Может быть, я должен передать некоторые параметры в GCC?
Я думал, что подобное решение с использованием шаблонов будет чище и эффективнее, чем решение с использованием макросов, но, вероятно, было неправильно ...