Поскольку вы используете C ++, вы можете избежать ловушек при использовании переменных списков аргументов, которые связаны со многими проблемами:
- Нет проверки количества аргументов
- Нет проверки типа аргумента
Чтобы сделать его более C ++, сделайте что-то вроде:
#define EVENT_INFO(args) EventLogStream (__FILE__, __LINE__, __PRETTY_FUNCTION__) << args
и вызывайте его следующим образом (предупреждение: весь код здесь псевдокод и может быть синтаксически неправильным, но вы должны понять основную идею):
EVENT_INFO ("The answer to " << the_question << " is " << answer); // usually 42
EventLogStream аналогичен объекту cout и, подобно cout, вы можете предоставить вывод, специфичный для класса:
class Vector3D
{
EventLogStream &operator << (EventLogStream &out) { out << "{" << x << ", " << y << ", " << z << "}"; }
}