Ошибка преобразования макроса с переменной args (...) в шаблон переменной constexpr

Я попытался преобразовать этот макрос на основе этой статьи в constexpr, но не могу сделать это правильно:

#define log_error(...) log_api(__FILE__, __LINE__, log_api_severity::error, /*print_console=*/false, __VA_ARGS__)

Вот моя последняя попытка, и я совершенно обескуражен...

template<typename ...Args>
std::result_of<Args...>::type tmpl_call_return_f(Args...&& args)
{
    return log_api(__FILE__, __LINE__, log_api_severity::error, /*print_console=*/false, std::forward<Args>(args)...);
}

Я получил ошибку от Visual Studio 2019:

(struct) result_of<_Fty> в пространстве имен std объясняет использование

используйте ключевое слово "typename", чтобы рассматривать не тип "std:: result_of<_Fty>:: type [with _Fty = Args...]" как тип в зависимом контексте

Я не понимаю, как исправить код и что оттуда делать.

Ниже приведен пример, который строится с помощью Visual Studio 2019 (я закомментировал constexpr и использую макрос для определения контекста моей попытки):

#include <iostream>
#include <cstdarg>

// This is the macro I want to convert into constexpr variadic template?
#define log_error(...) log_api(__FILE__, __LINE__, log_api_severity::error, /*print_console=*/false, __VA_ARGS__)

// Error: use the 'typename' keyword to treat nontype "std::result_of<_Fty>::type[with _Fty=Args...]" as a type in a dependent context
// template<typename ...Args>
// std::result_of<Args...>::type tmpl_call_return_f(Args...&& args)
// {
//     return log_api(__FILE__, __LINE__, log_api_severity::error, /*print_console=*/false, std::forward<Args>(args)...);
// }

// Log severity levels
enum class log_api_severity
{
    error = 0,
    warning = 50,
    info = 51,
    debug = 52,
    trace = 53,
    all = 54,
    disabled = 55,
};

bool log_api(const char* filename, const int line_number, const log_api_severity severity, const bool print_console, const char* fmt, ...)
{
    char     msg[1024] = "";
    va_list  args;
    va_start(args, fmt);
    vsprintf_s(msg, sizeof(msg), fmt, args);

    // write in the log file...
    printf("%s", msg);

    va_end(args);
    return true;
}

int main()
{
    log_error("this is an error message");
    return 0;
}

0 ответов

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