Информация об изменениях

Сообщение Re: std::to_string от 17.05.2025 9:35

Изменено 17.05.2025 9:51 rg45

Re: std::to_string
Здравствуйте, Marty, Вы писали:

M>Насколько легально перегружать to_string из NS std для своих типов?


Ну, to_string и раньше не была обозначена как "customization point". А в последних версиях я и вовсе не нахожу этого пункта. Выходит, нельзя. Подробнее можно почитать по ссылкам:

https://en.cppreference.com/w/cpp/language/extending_std
https://timsong-cpp.github.io/cppwp/constraints

M>ADL — не работает. Вернее, конечно же работает для моих типов, когда я пишу to_string(myTypeVal), но это вполне ожидаемо не работает для встроенных типов. Как быть?


Я бы сразу затачивал собственную программу на использование собственной версии ToString, через которую будут доступны все версии std::to_string и которую можно будет расширять и кастомайзить, как только дуще угодно.

Эскизно (с концептами) так:

template <template T>
concept StdToStringCompatible = requires(T t) {{std::to_string(t)} -> std::convertible_to<std::string>;};

std::string ToString(StdToStringCompatible auto&& t) {return std::to_string(t);}

std::string ToString(const MyTypeVal& t) { return /* . . . */; }


Того же эффекта можно добиться и на SFINAE, просто вместо концептов будут классы метафункций.
Re: std::to_string
Здравствуйте, Marty, Вы писали:

M>Насколько легально перегружать to_string из NS std для своих типов?


Ну, to_string и раньше не была обозначена как "customization point". А в последних версиях я и вовсе не нахожу этого пункта. Выходит, нельзя. Подробнее можно почитать по ссылкам:

https://en.cppreference.com/w/cpp/language/extending_std
https://timsong-cpp.github.io/cppwp/constraints

M>ADL — не работает. Вернее, конечно же работает для моих типов, когда я пишу to_string(myTypeVal), но это вполне ожидаемо не работает для встроенных типов. Как быть?


Я бы сразу затачивал собственную программу на использование собственной версии ToString, через которую будут доступны все версии std::to_string и которую можно будет расширять и кастомайзить, как только душе угодно.

Эскизно (с концептами) так:

template <template T>
concept StdToStringCompatible = requires(T t) {{std::to_string(t)} -> std::convertible_to<std::string>;};

std::string ToString(StdToStringCompatible auto&& t) {return std::to_string(t);}

std::string ToString(const MyTypeVal& t) { return /* . . . */; }


Того же эффекта можно добиться и на SFINAE, просто вместо концептов будут классы метафункций.