C ++,GCC:避免评估无用的表达式

时间:2012-02-12 00:13:08

标签: c++ templates gcc macros evaluation

我使用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 个答案:

答案 0 :(得分:1)

我不确定如果没有宏可以实现这一目标。所以作为参考,这里有一个类似于google-glog中使用的宏:

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

其中quiet是布尔值。然后在你的代码的其他地方:

LOG << some_var;