C ++, GCC: избегайте оценки бесполезных выражений - PullRequest
1 голос
/ 12 февраля 2012

Я определил класс 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?

Я думал, что подобное решение с использованием шаблонов будет чище и эффективнее, чем решение с использованием макросов, но, вероятно, было неправильно ...

1 Ответ

1 голос
/ 12 февраля 2012

Я не уверен, как этого можно достичь без макросов.Итак, для справки, вот макрос, подобный тому, который используется в google-glog:

#define LOG (quiet) ? (void)0 : your_logging_object

, где quiet - логическое значение.Тогда в другом месте в вашем коде:

LOG << some_var;
...