макрос C ++, завернутый в указатель на функцию для помещения в вектор - PullRequest
0 голосов
/ 15 декабря 2010

У меня есть макрос, который может выглядеть следующим образом (из библиотеки лога буста)

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

Можно ли обернуть это в объект boost :: function <> или указатель на функцию и поместить его в очередь или вектор таких элементов?

Если это так, как бы я это сделал?

Я пытаюсь написать механизм, в котором у меня есть 1 поток для записи всех журналов в файлы журналов, и любой из рабочих потоков должен иметь возможность войти в него, но в зависимости от уровня активного журнала, я бы только хочу войти, что настроено для входа. Таким образом, я бы создал очередь для любого потока, чтобы поставить в очередь сообщения журнала, а затем записать их в соответствующий файл с выделенным потоком, чтобы не замедлять работу моей программы, когда требуется много журналирования. Я хочу использовать библиотеку boost :: log, поэтому мне нужно работать с этим макросом, поскольку он записывает в файл под обложками.

lvl - это уровень журнала, который вы передаете этой функции. его использование будет: L_(debug) << "some log text";

Ответы [ 5 ]

1 голос
/ 15 декабря 2010

Есть ли причина, по которой вы не можете использовать реализацию Boost выделенного средства записи потоков?

typedef logger_format_write< default_, default_, writer::threading::on_dedicated_thread > logger_type;
1 голос
/ 15 декабря 2010
struct LogFunction
{
    LogFunction(int lvl) :lvl_(lvl) {}    

    TYPE operator () () { return L_(lvl_); }
    // Where "TYPE" is whatever type L_ returns
private:
    int lvl_;
};
1 голос
/ 15 декабря 2010

Если у вас есть фиксированный набор уровней ведения журнала, вы можете просто вызвать этот макрос из функции и использовать указатель на эту функцию:

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 голосов
/ 15 декабря 2010
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);
0 голосов
/ 15 декабря 2010

Нет, вы не можете поместить макрос где-нибудь рядом с указателем на функцию, подобную этой.Такой макрос не нужен, вы можете просто использовать объектно-ориентированную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...