假设我有以下代码:
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/