2010-12-15 4 views
0

に入れるために、関数ポインタに包まれたマクロC++私は(ブーストログライブラリから)次のように見えるかもしれませんマクロを持つベクトル

#define L_(lvl) BOOST_LOG_USE_LOG_IF_LEVEL(g_l(), g_log_level(), lvl) 

はブーストにこれをラップすることが可能です::機能<>オブジェクト関数ポインタをキューまたはそのようなアイテムのベクトルに張り付けることができますか?

もしそうなら、どうすればいいですか?

ログファイルにすべてのログを書き込む1つのスレッドがあり、どのワーカースレッドでもログに記録できる必要がありますが、アクティブなログレベルに依存するメカニズムを作成しようとしています。 dは、ログに記録されるように設定されたものだけを記録します。だから私はログメッセージを待ち行列に入れるための待ち行列を作成し、専用のスレッドでそれぞれのファイルに書き込むので、たくさんのロギングが必要なときにプログラムを遅くしないようにします。私はboost :: logライブラリを使いたいので、このマクロで作業する必要があります。

lvlは、この機能に渡すログレベルです。 L_(debug) << "some log text";

答えて

1

、あなただけの関数内からそのマクロを呼び出すと、その関数へのポインタを使用することができます

void log() { 
    L_(3); 
} 

void anotherlog() { 
    L_(13); 
} 

あなたは簡単にベクターに、次に呼び出すことができそれらすべて:

typedef void (*LogFunction)(); 
std::vector<LogFunction> logFunctions; 
logFunctions.push_back(log); 
logFunctions.push_back(anotherLog); 

std::vector<LogFunction>::iterator it, end = logFunctions.end(); 
for (it = logFunctions.begin(); it != end; ++it) 
    (*it)(); 
+0

と、このL_マクロがログメッセージのために取るストリーミング<<演算子はどうですか?ファンクタを使用し、その演算子にオーバーロードする必要がありますか? –

0

いいえ、そのような関数ポインタの近くにマクロを置くことはできません。このようなマクロは必要ありません。オブジェクト指向の関数を使うことができます。あなたはログレベルの固定セットを持っている場合は

+0

私は使用しているライブラリのこの部分だけでもかまいません。 –

0
void Log(int level) 
{ 
    L_(level); 
} 

typedef boost::function1<void, int> LogFunction; 

std::vector<LogFunction> LogFunctionVector; 

LogFunction L3 = Log(3); 
LogFunction L5 = Log(5); 

LogFunctionVector.push_back(L3); 
LogFunctionVector.push_back(L5); 
1
struct LogFunction 
{ 
    LogFunction(int lvl) :lvl_(lvl) {}  

    TYPE operator()() { return L_(lvl_); } 
    // Where "TYPE" is whatever type L_ returns 
private: 
    int lvl_; 
}; 
1

を使用すると、専用のスレッドWRのブースト実装を使用できない理由はありますiter?

typedef logger_format_write< default_, default_, writer::threading::on_dedicated_thread > logger_type; 
関連する問題