Проблема C++ FMT с форматированием пользовательского абстрактного классаC++

Программы на C++. Форум разработчиков
Anonymous
Проблема C++ FMT с форматированием пользовательского абстрактного класса

Сообщение Anonymous »

Я работаю над системой событий для личного проекта и пытаюсь сделать так, чтобы события регистрировались на консоли так же просто, как LOG(event).
В этом случае события определяются классом Event, который имеет несколько методов и виртуальную функцию ToString(), которая возвращает строку с информацией о событии и всем, что я хочу выводить по каждому событию. Этот класс расширяется за счет определения конкретных классов событий, которые наследуются от класса Event и определяют функцию ToString() в соответствии с тем, что делает каждое событие и какие переменные оно имеет.
Поэтому мой макрос LOG вызывает функцию статического класса журнала для отображения сообщения в консоли путем преобразования аргументов в строку, например:

Код: Выделить всё

#define LOG(...) Log::DisplayLog(LogUtils::StringFromArgs(__VA_ARGS__))
Это сделано так, потому что DisplayLog() получает и другие информационные параметры, которые не важны для моей проблемы.
LogUtils: Функция :StringFromArgs() преобразует аргументы в строку с помощью fmt, выполняя следующие действия:

Код: Выделить всё

template
inline std::string StringFromArgs(const FormatString& fmt, const Args &... args)
{
char arg_string[1024];
memset(arg_string, 0, sizeof(arg_string));
fmt::format_to(arg_string, fmt, args...);
return std::string(arg_string);
}
Итак, поскольку я использую для этого fmt, я подумал, что создать журнал событий так, как я хочу, будет легко, следуя рекомендациям fmt, идея заключалась в том, чтобы установить форматировщик для класса событий:

Код: Выделить всё

template
struct fmt::formatter : fmt::formatter
{
template
constexpr auto parse(ParseContext& ctx) { return ctx.begin(); }

template
auto format(const T& event, FormatCtx& ctx) // also tried Event& instead of T&
{
return fmt::format_to(ctx.out(), "{0}", event.ToString());
// also tried:
//return fmt::formatter::format(event.ToString(), ctx);
}

};
Однако это не работает, когда я пытаюсь выполнить LOG(event) определенного класса событий (скажем, «событие» — это WindowResizedEvent, наследуемый от Event) У меня продолжает возникать та же ошибка из fmt, потому что он не может отформатировать событие (также я пытался добавить оператор const char*() в класс Event и все равно тот то же):
Изображение

Аргумент 2 — это аргумент «события» (как я уже сказал, у меня есть несколько других аргументов посередине, которые не важны для этой проблемы).
Кто-нибудь знает, как мне отформатировать это, не указывая форматировщик для каждого типа класса событий? Потому что для каждого типа событий всегда будет один и тот же код.

Подробнее здесь: https://stackoverflow.com/questions/705 ... ract-class

Вернуться в «C++»