В этом случае события определяются классом Event, который имеет несколько методов и виртуальную функцию ToString(), которая возвращает строку с информацией о событии и всем, что я хочу выводить по каждому событию. Этот класс расширяется за счет определения конкретных классов событий, которые наследуются от класса Event и определяют функцию ToString() в соответствии с тем, что делает каждое событие и какие переменные оно имеет.
Поэтому мой макрос LOG вызывает функцию статического класса журнала для отображения сообщения в консоли путем преобразования аргументов в строку, например:
Код: Выделить всё
#define LOG(...) Log::DisplayLog(LogUtils::StringFromArgs(__VA_ARGS__))
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);
}
Код: Выделить всё
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);
}
};

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