减少c ++中的代码重复

时间:2013-10-25 06:24:51

标签: c++ refactoring

我可以将以下代码减少为一个功能吗?他们中的大多数都是一样的。感谢

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; ...

有更好的方法吗?谢谢

3 个答案:

答案 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);
}