Проблема 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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