Re[3]: Cоздание базового шаблона минуя специализацию
От: so5team https://stiffstream.com
Дата: 26.10.22 12:18
Оценка: +1
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.