Closed kelbon closed 1 year ago
я бы вообще бы прошелся по всем типам в std для которых объявлен operator<< и сделать пропозал для добавления форматтеров, мне вот не хватает filesystem::path. Если с filesystem::path все просто. То с thread::id не очень, т.к. из public методов у него только конструктор.
Но я даже не знаю как тут быть, только действительно пропозал делать :)
Т.е. например для MSVC STL это бы выглядело так
class thread::id { // thread id
public:
id() noexcept : _Id(0) {} // id for no thread
private:
id(_Thrd_id_t _Other_id) : _Id(_Other_id) {}
_Thrd_id_t _Id;
// пропустим не нужное
template <class _Ch, class _Tr>
friend basic_ostream<_Ch, _Tr>& operator<<(basic_ostream<_Ch, _Tr>& _Str, thread::id _Id);
friend hash<thread::id>;
friend formatter<thread::id>; // added
};
template <>
struct formatter<thread::id> : public formatter<_Thrd_id_t> { // _Thrd_id_t alias на unsigned int
template <typename FormatContext>
auto format(const thread::id& id, FormatContext& ctx) {
return std::formatter<_Thrd_id_t>::format(id._Id, ctx);
}
};
Но тут возникает вторая проблема, нам для этого придется подключать format внутри thread, да и внутри любого друго хедера. Как это сейчас сделано в chrono. В MSVC STL заведен issue на избавление от такого подключения, но пока без движения.
Поправили в https://wg21.link/P2693
Очевидно, что всё что умеет выводиться в потоки (имеет оператор << для стримов) должно уметь выводиться и в std::format, но на данный момент вот этот код, который по сути делает одно и то же, не компилируется.(формат не умеет работать с этим типом)
В предложениях в С++23 не увидел этого