std::to_string
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.05.25 22:12
Оценка:
Здравствуйте!

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

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

По std::to_chars — вопрос аналогичный (да и по всем подобным кейсам)
Маньяк Робокряк колесит по городу
Отредактировано 16.05.2025 22:14 Marty . Предыдущая версия .
Re: std::to_string
От: rg45 СССР  
Дата: 17.05.25 09:35
Оценка: +1
Здравствуйте, 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, просто вместо концептов будут классы метафункций.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 17.05.2025 9:51 rg45 . Предыдущая версия . Еще …
Отредактировано 17.05.2025 9:49 rg45 . Предыдущая версия .
Отредактировано 17.05.2025 9:47 rg45 . Предыдущая версия .
Re: std::to_string
От: rg45 СССР  
Дата: 17.05.25 09:58
Оценка: 8 (1) +1
Здравствуйте, Marty, Вы писали:


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

M>По std::to_chars — вопрос аналогичный (да и по всем подобным кейсам)

Как вариант:


namespace my {

using std::to_string;

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

// Ну и вызываешь уже без явной квалификации "std::"
// При этом подключится и ADL
void foo() {
   auto item = makeObj(/*...*/);
   std::cout << to_string(item) << std::endl; 
}

} // namespace my
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 17.05.2025 10:01 rg45 . Предыдущая версия .
Re[2]: std::to_string
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 17.05.25 21:41
Оценка:
Здравствуйте, rg45, Вы писали:

R>Как вариант:


R>

R>namespace my {

R>using std::to_string;
R>} // namespace my

R>


В целом норм идея, я подобное даже делал много раз, что тут протупил, хз
Маньяк Робокряк колесит по городу
Re[3]: std::to_string
От: flаt  
Дата: 20.05.25 12:55
Оценка:
Здравствуйте, Marty, Вы писали:

M>В целом норм идея, я подобное даже делал много раз, что тут протупил, хз


Это же классика, как и `using std::swap`.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.