Ваши вопросы на самом деле апеллируют к двум ответам. Вы хотите использовать универсальную функцию ведения журнала, которая работает как printf, но может быть полностью настроена. Итак, вам нужно:
- макрос, принимающий переменное количество аргументов
- функция, принимающая переменное число аргументов
Вот пример вашего кода:
#include <stdio.h>
#include <stdarg.h>
class CLogClass
{
public:
static void DoLogWithFileLineInfo( const char * fmt, ... )
{
va_list ap;
va_start( ap, fmt );
vfprintf( stderr, fmt, ap );
va_end( ap );
}
};
#define MYLOG(format, ...) CLogClass::DoLogWithFileLineInfo("%s:%d " format , __FILE__, __LINE__, __VA_ARGS__)
int main()
{
MYLOG("Hello world!\n", 3); // you need at least format + one argument to your macro
MYLOG("%s\n", "Hello world!");
MYLOG("%s %d\n", "Hello world!", 3);
}
Макросы Variadic были введены в C99, поэтому он будет работать на компиляторах, поддерживающих C99 или C ++ 0x. Я успешно протестировал его с gcc 3.4.2 и Visual Studio 2005.
Вариативные аргументы для функций существовали всегда, поэтому не беспокойтесь о совместимости.
Возможно, это возможно сделать с помощью некоторого шаблонного метапрограммирования, но я не вижу интереса к нему, учитывая простоту приведенного выше кода.
В качестве последнего замечания, зачем использовать статический метод в пустом классе вместо функции?