我可以将以下代码减少为一个功能吗?他们中的大多数都是一样的。感谢
void info(StreamLog &streamLog)
{
streamLog.ss << "info:";
streamLog.mFilter->setLogLevel("info");
}
void debug(StreamLog &streamLog)
{
streamLog.ss << "debug:";
streamLog.mFilter->setLogLevel("debug");
}
void warning(StreamLog &streamLog)
{
streamLog.ss << "warning:";
streamLog.mFilter->setLogLevel("warning");
}
void error(StreamLog &streamLog)
{
streamLog.ss << "error:";
streamLog.mFilter->setLogLevel("error");
}
void critical(StreamLog &streamLog)
{
streamLog.ss << "critical:";
streamLog.mFilter->setLogLevel("critical");
}
如果您需要更多信息,请告诉我
第1编辑: 对不起!我没有清楚地解释我的情况。我使用那些函数作为操纵器。因此,我可以做到
clog&lt;&lt;信息&lt;&lt; ...
clog&lt;&lt;警告&LT;&LT; ...
我不想使用
clog&lt;&lt; log(info)&lt;&lt; ...
有更好的方法吗?谢谢
答案 0 :(得分:10)
void log(StreamLog &streamLog, const string& level)
{
streamLog.ss << level << ":";
streamLog.mFilter->setLogLevel(level);
}
始终尝试查看常用操作并将其抽象为不同的函数。
答案 1 :(得分:2)
我和@RémiBenoit在一起,但为了给你提供另一种选择,你可以使用enum
和地图:
enum log_level {
info, debug, warning, error, critical
}
void log(StreamLog& streamLog, log_level level) {
static const std::map<log_level, std::string> levels = {
{ info, "info" }, { debug, "debug" }, { warning, "warning" },
{ error, "error" }, { critical, "critical" }
};
auto iter = levels.find(level);
if(iter == levels.end()) return;
streamLog.ss << iter->second;
streamLog.mFilter->setLogLevel(iter->second);
}
这样做的好处是您的日志级别仅限于enum
(以及地图)中的内容,但如果您不需要此约束,则最好使用@Rémi的解决方案。< / p>
答案 2 :(得分:0)
这是Mark's&amp; amp;的另一种选择。 Rémi的解决方案使用模板。该解决方案可用于高性能至关重要的领域。模板允许编译器将大量信息烘焙到每个模板化函数中,因此应该有较小的运行时间成本,尤其是与地图查找方法相比时。
此外,这将限制在编译时而不是在运行时使用的log_level的值。
enum class log_level { info, debug, warning, error, critical };
template<log_level> struct log_helper{ static const char* const text; };
template<> const char* const log_helper<log_level::info>::text = "info";
template<> const char* const log_helper<log_level::debug>::text = "debug";
template<> const char* const log_helper<log_level::warning>::text = "warning";
template<> const char* const log_helper<log_level::error>::text = "error";
template<> const char* const log_helper<log_level::critical>::text = "critical";
template<log_level level> void set_log_level(StreamLog& streamLog)
{
streamLog.ss<< log_helper<level>::text << ":";
streamLog.mFilter->setLogLevel(log_helper<level>::text);
}