Как передать переменные аргументы с макросом __VA_ARGS__ через несколько функций
Прямо сейчас у меня есть функция журнала ошибок, которая использует библиотеку журналов C++ spdlog для записи переменных переменных через шаблонные, перегруженные функции, например:
template<typename ptrType, typename argType>
inline void ErrorReport(ptrType* data, const std::string& c_errMessage, argType arg1)
{
if (data != nullptr)
{
return;
}
else
{
auto console = spdlog::stdout_color_mt("console");
console->error(c_errMessage.c_str(), arg1);
exit(0);
}
}
//Overloaded ErrorReport function with two arguments passed
template<typename ptrType, typename argType, typename argType2>
inline void ErrorReport(ptrType* data, const std::string& c_errMessage, argType arg1, argType2 arg2);
{
//Similar implementation as above except with extra argument passed
}
Тогда я смогу регистрировать ошибки в моем коде так:
ErrorReport(someDataToCheck, "data = nullptr! errorcode: {}", getErrCode());
Если мне понадобится все больше и больше аргументов для передачи в мое сообщение, я просто создам больше перегруженных функций, чтобы принимать больше параметров аргумента. Тем не менее, я хочу иметь возможность просто передать переменное количество аргументов (...) вместо всех этих перегруженных функций. Проблема в том, что я хочу сделать это поверх регистрации файла и номера строки, где происходит ошибка. Единственный известный мне способ регистрации файла и строки - создание макрофункции. Если я это сделаю, то как мне правильно перехватить и передать переменные аргументы нескольким функциям, использующим макрос?
Поэтому я хотел бы сделать что-то вроде этого:
#define ERRASSERT(pToData, msg, ...) \
do { ErrorReport(pToData, msg, __FILE__, __LINE__, __VA_ARGS__); } while (0)
ErrorReport(ptrType* data, const std::string& c_errMessage, const char* file, int lineNumber, ...)
{
auto console = spdlog::stdout_color_mt("console");
console->error("File: {}, Line: {}", file, lineNumber);
console->error(c_errMessage.c_str(), /* variable arguments get passed here some how */);
exit(0);
}