3

カスタムのプラットフォーム依存ロガーを使用するアプリケーションに取り組んでいます。アプリケーションはいくつかの printf スタイルのマクロを定義します:

#define LOG_DEBUG(format, ...) \
  logger.log(DEBUG, __FUNCTION__, format, ##__VA_ARGS__)

...

ここ数日、アプリケーションを使用するように移動する作業を行ってきましたboost.log。私が抱えている最大の問題は、boost のログ API が iostream スタイルで実装されているため、ロガーの内部のみを変更する必要があるように、このマクロ形式を保持しようとすることです。

BOOST_LOG(logger) << "something";
  1. 文字列バッファを使用せずに、printf スタイルの引数を取得してブースト ロガーに出力するマクロを提供する簡単な方法はありますか? (文字列にフォーマットする必要があると、パフォーマンスに影響があると思います)
  2. そうでない場合、さまざまなプラットフォームの書式設定関数の実装をva_args必要とせずに文字列を書式設定する方法はありますか? #ifdef(これは、そもそもboost.logに移行することの全体的なポイントでした)
4

2 に答える 2

3

または、Boost Formatを使用して printf フォーマット文字列を処理します。例えば、

template<typename Level, typename T1>
inline void log_format(
    const Level level,
    const char* const fmt,
    const T1& t1)
{
    BOOST_LOG_SEV(logger::get(), level) << boost::format(fmt) % t1;
}

これを作成loggerおよび拡張して複数の引数 (ほとんどの場合、可変個引数のテンプレート引数を使用) を処理することは、読者の課題として残されています。

于 2014-05-22T20:01:07.690 に答える