Nim的答案的轻微替代品:
创造
class LockedLog {
static MutEx mutex; // global mutex for logging
ScopedLock lock; // some scoped locker to hold the mutex
Logger &oLogger; // reference to the log writer itself
public:
LockedLog(Logger &oLogger) : oLogger(oLogger), lock(mutex) {}
template <typename T>
LockedLog &operator<<(const T &value) { oLogger << value; return *this; }
};
或者只是这样做:
LockedLog(oLogger) << "Log this" << " and this " << " and " << 10 << endl;
或者改成Logger::operator<<
普通方法,在 中调用该方法LockedLog::operator<<
,将 cast-operator 添加到Logger
:
operator LockedLog() { return LockedLog(*this); }
这应该为您当前的代码添加锁定。
更新:锁定所有调用,operator<<
甚至可能锁定对其参数的评估(取决于编译器是先评估左参数还是右参数,并且它可以选择)。为了减少这种情况,可以:
class LockedLog {
static MutEx mutex; // global mutex for logging
std::stringstream buffer; // temporary formatting buffer;
Logger &oLogger; // reference to the log writer itself
public:
LockedLog(Logger &oLogger) : oLogger(oLogger), lock(mutex) {}
template <typename T>
LockedLog &operator<<(const T &value) { buffer << value; return *this; }
~LockedLog() { ScopedLock lock(mutex); oLogger << buffer.str() << std::flush; }
};
但是这stringstream
增加了另一个开销。