【发布时间】:2015-02-04 21:56:46
【问题描述】:
我的应用程序需要非常简单的记录器。但有时我不想使用这个记录器来加速我的应用程序。
我的记录器看起来像:
class Logger
{
public:
Logger(bool isActive = true)
{
mIsActive = isActive;
if (isActive)
{
out.open(pathToLogFile);
}
}
static std::ofstream& log()
{
return out;
}
private:
static bool mIsActive;
static std::ofstream out;
};
在我的应用程序中,我将其用作:
Logger(true); // in one place
Logger::log() << "Log" << std::endl;
如果我不想使用这个记录器怎么办?
Logger(false); // in one place. it doesn't open any file.
Logger::log() << "Log" << std::endl; // it shouldn't write anywhere
如果我没有打开文件,
【问题讨论】:
-
最困扰我的是你如何滥用构造函数来操纵
static数据成员。 -
@5gon12eder 用没有免费功能的语言来做会很有趣。
class imAFunction {...}? -
好吧,您总是可以在布尔上下文中评估流对象以查看它是否处于良好状态,如果是则仅写入。就像这样
if ( Logger::log() ) { Logger::log() << "blah blah"; }。但无论如何,在没有检查参考的情况下,是的,我认为写入未打开/处于良好状态的流应该是安全的。编辑:再一次,也许不是:stackoverflow.com/questions/20693758/… -
@Quentin:我承认曾多次这样做以滥用模板专业化:
template<> class imAFunction<int> {int v; imAFunction(int e):v(e+2){} operator int() const {return v;} }; -
我猜 @MooingDuck 可专用包装器中的静态函数被高估了。