Здравствуйте, Videoman, Вы писали:
V>Наверное вопрос в этом, как выкрутится теперь. Ситуация простая. У std::formatter есть специализация для вывода std::chrono::duration<>. У меня в библиотеках везде используется своя специализация времени:V>using reftime_t = std::chrono::duration<int64, std:ratio<1, 10000000>>;
V>
Поскольку в C++ нет strong typedef, то компилятор C++ не может отличить ваш reftime_t от каких-либо других алиасов для std::chrono::duration.
ИМХО, тут напрашивается одно из двух:
— либо вы делаете свой reftime_t таки strong typedef-ом для std::chrono::duration, чтобы это был именно что другой тип на уровне C++. И тогда делаете для своего типа нужную вам специализацию std::formatter (наследуясь от
std::formatter<std::chrono::duration<...>>);
— либо вы делаете обертку для своего reftime_t:
struct reftime_for_std_format_t {
reftime_t val_;
};
[[nodiscard]]
inline reftime_for_std_format_t wrap(reftime_t v) { return { v }; }
Затем пишете для reftime_for_std_format_t специализацию std::formatter. И отображаете свои значения reftime_t посредством wrap:
std::format("Duration is {}", wrap(your_reftime_value));
И тот, и другой способы геморройные. Разве что для первого способа можно задействовать какую-то готовую библиотеку с реализацией strong typedef.