C++ : Ignoring multiple << Operators in a line

标签 c++ logging stream operator-keyword

假设我有以下代码:

int ignored = 0;
StreamIgnore si;

si << "This part" << " should be" << ignored << std::endl;

我希望当这段代码运行时 si将简单地忽略流的其余部分。 问题是我希望它尽可能高效。 一个明显的解决方案是:

template <typename T>
StreamIgnore& opertaor<<(const T& val) {
    //Do nothing
    return *this;
}

但是,如果代码是这样的:

StreamIgnore si;

si << "Fibonacci(100) = " << fib(100) << std::endl;

然后我将不得不计算fib(100)//Do Nothing 之前部分。 所以,我希望能够在没有任何不必要的计算的情况下完全忽略其余部分。

为了使这个请求有意义,认为 StreamIgnore可能是 StreamIgnoreOrNot类,并且 c'tor 通过返回 *this 来决定是否忽略流。并使用流,或 new StreamIgnore()实例并忽略其余部分。

我考虑过如何使用宏,但无法想出使我能够使用此语法的东西(即 "si << X << Y...")。

如果有人可以建议一种方法,我将不胜感激。

谢谢

最佳答案

我显然会使用 IOstreams 来禁用/启用相当于设置/清除 std::ios_base::failbit 的输出。这样做很容易阻止格式化和写入数据。但是,它不会阻止对参数的评估。为此,我将使用逻辑与运算符:

si && si << not_evaluated() << when_not_used();

关于C++ : Ignoring multiple << Operators in a line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23270846/

相关文章:

c++ - 从 Java : How to define lambda members for enum types in C++? 翻译

c++ - QSlider、QTimer 和 valueChanged 用法

c++ - STL map Custom Key Class [默认构造函数]

python - 如何将电压读数限制在写入日志文件的范围内?

python - 扩展 Python 记录器

c# - 为什么 WCF 流响应在写入磁盘时损坏?

c++ - 使用 nullptr 和零大小进行分配

performance - Grails审核日志记录插件-性能

javascript - 如何使用流解析缓冲区中的行?

c - 撤消 ungetc() : "How" do fseek(), rewind() 和 fsetpos() 的效果吗?是否每次都重新填充缓冲区?