Принятие переменного количества аргументов для логгера - PullRequest
2 голосов
/ 09 февраля 2012

Я не знаю, может ли это быть достигнуто с помощью шаблонов с вариациями, маркеров с вариадами или даже с помощью метапрограммирования.

В основном, у меня есть объект журналирования, подобный этому:

LOG << "This is the value of variable X: " << varaibleX;

но я также хочу, чтобы это можно было использовать LOG как функцию

LOG ( "This is the value of variable X: ", variableX);

но количество аргументов может быть разным. (при условии, что их вызов может быть преобразован в потоки)

Я смотрел на LOG ( ... ), но действительно не знал, как расширить аргументы.

Так скажем, кто-то написал

LOG(X, Y, Z);

и я хочу расширить это на:

LOG << X << Y << Z;

Можно ли это сделать?

1 Ответ

1 голос
/ 09 февраля 2012

Это можно сделать с помощью шаблонов с переменными параметрами, как показано ниже. Поскольку неясно, каков ваш объект LOG, я пропустил код для фактического вызова LOG (...), но вы должны быть в состоянии портировать это для того, что вам нужно:

#include <iostream>

/**
 * A specialization to stream the last argument 
 * and terminate the recursion. 
 */
template<typename Stream, typename Arg1>
Stream & DoLog(Stream & stream, const Arg1 & arg1)
{
   return (stream << arg1);
}

/** 
 * Recursive function to keep streaming the arguments 
 * one at a time until the last argument is reached and 
 * the specialization above is called. 
 */
template<typename Stream, typename Arg1, typename... Args>
Stream & DoLog(Stream & stream, const Arg1 & arg1, const Args&... args)
{
   return DoLog((stream << arg1), args...);
}

int main()
{
   DoLog(std::cout, "First ", 5, 6) << " Last" << std::endl;
}

Вам нужно будет скомпилировать это с поддержкой c ++ 0x . В g ++ это можно сделать с помощью флага - std = c ++ 0x .

...