包含在函数指针中的c ++宏放入向量中

时间:2010-12-15 13:59:03

标签: c++ multithreading logging macros function-pointers

我有一个宏看起来如下(来自升级日志库)

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

是否可以将其包装成boost :: function<>对象或函数指针并将其粘贴在这些项的队列或向量中?

如果是的话,我该怎么做?

我正在尝试编写一种机制,我有一个线程将所有日志记录写入日志文件,并且任何工作线程都需要能够记录到它,但是依赖于活动日志级别,我会只想记录配置为记录的内容。因此,我会为任何线程创建一个队列来对日志消息进行排队,然后使用专用线程将它们写入各自的文件,以便在需要大量日志记录时不会减慢程序的速度。我想使用boost :: log库,所以我必须使用这个宏,因为这会写入封面下的文件。

lvl是您传递给此函数的日志级别。它的用途是:L_(debug) << "some log text";

5 个答案:

答案 0 :(得分: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)();

答案 1 :(得分:1)

struct LogFunction
{
    LogFunction(int lvl) :lvl_(lvl) {}    

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

答案 2 :(得分:1)

有没有理由不能使用专用线程编写器的Boost实现?

typedef logger_format_write< default_, default_, writer::threading::on_dedicated_thread > logger_type;

答案 3 :(得分:0)

不,你不能把宏放在像这样的函数指针附近的任何地方。甚至不需要像这样的宏,你可以只使用面向对象的函数。

答案 4 :(得分: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);