Ошибка преобразования макроса с переменной 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;
}