У нас есть огромный набор функций, представленных как внешний 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 <<
создаются в зависимости от типа параметра.
Отлично, за исключением того, что мы должны поддерживать список параметров полностью синхронным с списком окружающей функции.
Isесть какой-то способ просто захватить все параметры одновременно - что-то вроде этого:
TRACE_ALL_PARAMETERS( UNIVERSAL_MAGIC )
, чтобы нам не приходилось перечислять каждый параметр явно?