cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить в стандарт специализацию std::formatter для thread_id #505

Closed kelbon closed 1 year ago

kelbon commented 2 years ago

Очевидно, что всё что умеет выводиться в потоки (имеет оператор << для стримов) должно уметь выводиться и в std::format, но на данный момент вот этот код, который по сути делает одно и то же, не компилируется.(формат не умеет работать с этим типом)

  std::cout << std::this_thread::get_id();
  std::cout << std::format("{}", std::this_thread::get_id());

В предложениях в С++23 не увидел этого

crackedmind commented 2 years 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 на избавление от такого подключения, но пока без движения.

crackedmind commented 1 year ago

https://isocpp.org/files/papers/P2693R0.pdf

apolukhin commented 1 year ago

Поправили в https://wg21.link/P2693