0

次のコードを 1 つの関数に減らすことはできますか? それらの大部分は同じです。ありがとう

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 << ログ(情報) <<...

より良い方法はありますか?ありがとう

4

3 に答える 3

0

テンプレートを使用した Mark と 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 に答える