Здравствуйте, 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, просто вместо концептов будут классы метафункций.
Здравствуйте, 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
Здравствуйте, rg45, Вы писали:
R>Как вариант:
R>
R>namespace my {
R>using std::to_string;
R>} // namespace my
R>
В целом норм идея, я подобное даже делал много раз, что тут протупил, хз
Здравствуйте, Marty, Вы писали:
M>В целом норм идея, я подобное даже делал много раз, что тут протупил, хз
Это же классика, как и `using std::swap`.