我使用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?
我认为使用模板的类似解决方案比使用宏的解决方案更干净,性能更好,但可能是错误的......
答案 0 :(得分:1)
我不确定如果没有宏可以实现这一目标。所以作为参考,这里有一个类似于google-glog中使用的宏:
#define LOG (quiet) ? (void)0 : your_logging_object
其中quiet
是布尔值。然后在你的代码的其他地方:
LOG << some_var;