0

我可以将以下代码简化为一个函数吗?它们中的大部分是相同的。谢谢

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");
}

如果您需要更多信息,请告诉我

第一次编辑:对不起!我没有清楚地解释我的情况。我将这些功能用作操纵器。因此,我可以

堵塞 << 信息 << ...

堵塞<<警告<<...

我不想用

堵塞<<日志(信息)<<...

有更好的方法吗?谢谢

4

3 回答 3

10
void log(StreamLog &streamLog, const string& level)
{
    streamLog.ss << level << ":";
    streamLog.mFilter->setLogLevel(level);
}

始终尝试查看通用操作并将其抽象为不同的功能。

于 2013-10-25T06:27:22.460 回答
2

我和@Rémi Benoit 在一起,不过为了给你提供一个替代方案,你可以使用一个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 的解决方案。

于 2013-10-25T06:37:09.543 回答
0

这是 Mark's & 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);
}
于 2013-10-26T09:16:17.613 回答