У нас есть огромный набор функций, открытых как внешний API, и нам нужно отслеживать все значения аргументов в каждом вызове. В настоящее время у нас есть макрос, который принимает список всех параметров:
void SomeApiFunction( bool parameter1, const wchar_t* parameter2 )
{
LOG_PARAMETERS( parameter1 << parameter2 )
//function payload
}
Макрос расширяется следующим образом:
#define LOG_PARAMETERS( x ) GlobalLoggerObject << x;
и GlobalLoggerObject
имеет тип class CLogger
, который имеет operator <<
перегружен для всех возможных типов параметров - что-то вроде этого:
template<class TypeToLog>
CLogger& operator << (const TypeToLog& parameter)
{
//logging code
return *this;
}
чтобы мы могли иметь список параметров любой длины и благодаря цепочке из <<
, все они могут быть переданы в макрос, и необходимые конкретные версии operator <<
создаются в зависимости от типа параметра.
Отлично, за исключением того, что мы должны поддерживать список параметров, полностью синхронных с параметром окружающей функции.
Есть ли какой-то способ просто сразу взять все параметры - что-то вроде этого:
TRACE_ALL_PARAMETERS( UNIVERSAL_MAGIC )
так что нам не нужно явно указывать каждый параметр?