アプリケーション用の単純なロガーがあります。(簡略化された)インターフェースは次のとおりです。
class ILogger
{
public:
virtual void LogUnsafe(const LogPriority& priority, const boost::format& message) = 0;
virtual void Log(const LogPriority& priority, const boost::format& message)
{
if (priority <= logPriority_)
{
std::unique_lock<std::mutex> lock(loggerMutex_);
LogUnsafe(priority, message);
}
}
void Log(const LogPriority& priority, const std::string& message)
{
Log(priority, boost::format(message));
}
template<typename T, typename... Args>
void Log(const LogPriority& priority, boost::format &format, const T &v, Args... args)
{
Log(priority, boost::format(format) % v, args ...);
}
template<typename... Args>
void Log(const LogPriority& priority, const char *format, Args... args)
{
boost::format fmt(format);
Log(priority, fmt, args ...);
}
};
ここで、(エラーを簡単に検出するために) すべてのログ メッセージに行と関数の情報を含める必要があります (__LINE__
とを使用__FUNCTION__
)。合理的には、関数の引数として渡す必要があります。そして、いつものように、ログメッセージを書くたびにそれらすべてのマクロを入力したくありません。だからここで困ってます。すべてのログメッセージに明示的に書き込まずに、ログ機能にエレガントに渡すにはどうすればよいですか?
前もって感謝します。