Как передать переменные аргументы с макросом __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);
}

0 ответов

Другие вопросы по тегам