В c# можно делать так: String.Format("At {1}, the temperature is {0}°C.", DateTime.Now, 20.4);
Это нужно для трансляции UI в разные языки, так как в разных язык может использовать разная последовательность аргументов.
Что-бы код не менять из-за этого, а указывать номер агрумента в шаблоне формата.
Нужен аналог в с++.
Мне кажеться, что принципиально нельзя это сделать в с++, так как что-бы добраться до 2-го элемента, нужно знать размер 1-го, а если он не указан в шаблоне, то не получиться.
Или я не прав ?
Здравствуйте, maks1180, Вы писали:
M>В c# можно делать так: String.Format("At {1}, the temperature is {0}°C.", DateTime.Now, 20.4);
M>Нужен аналог в с++.
https://en.cppreference.com/w/cpp/utility/format/format
Здравствуйте, Qbit86, Вы писали:
Q>https://en.cppreference.com/w/cpp/utility/format/format
это c++20, а реализовано только в MSVC, насколько я знаю. Есть аналог:
https://fmt.dev/latest/index.html
Здравствуйте, wl., Вы писали:
wl.>Здравствуйте, Qbit86, Вы писали:
Q>>https://en.cppreference.com/w/cpp/utility/format/format
wl.>это c++20, а реализовано только в MSVC, насколько я знаю.
в https://en.cppreference.com/w/cpp/compiler_support/20 зелёных кубиков больше одного.
это та функциональность, которая реализована только в библиотеке, и не затрагивает компилятор. Это означает, что наличие и работоспособность std::format определяется не им, а используемой реализацией стандартной библиотеки. Например, я могу собирать проект с libc++, и std::format сразу же становится доступным в msvc, g++, clang, ну и в других компиляторах, где есть поддержка core c++20.
Здравствуйте, maks1180, Вы писали:
M>В c# можно делать так: String.Format("At {1}, the temperature is {0}°C.", DateTime.Now, 20.4);
stringstream не смотрели? Может поможет.
Здравствуйте, maks1180, Вы писали:
M>В c# можно делать так: String.Format("At {1}, the temperature is {0}°C.", DateTime.Now, 20.4);
M>Это нужно для трансляции UI в разные языки, так как в разных язык может использовать разная последовательность аргументов.
M>Что-бы код не менять из-за этого, а указывать номер агрумента в шаблоне формата.
M>Нужен аналог в с++.
M>Мне кажеться, что принципиально нельзя это сделать в с++, так как что-бы добраться до 2-го элемента, нужно знать размер 1-го, а если он не указан в шаблоне, то не получиться.
M>Или я не прав ?
А при чем тут размеры элементов, когда C++ обеспечивает непосредственный доступ к параметрам фунции в произвольном порядке? Дело тут вовсе не в технической невозможности. В стандартной библиотеке С++ долгое время не было утилит форматирования, просто потому что в нее не хотели тянуть Си-шный механизм функций с переменным числом параметров, поскольку он подрывает один из самых важных принципов С++ — типовую безопасность. В то же время, равноценные возможности предоставляли многие сторонние библиотеки, тот же boost::format, например. И только с появлением в С++11
parameter packs это направление получило новое развитие. И вот, в С++20 появилась
Formatting library. И теперь форматирование в C++ выглядит не хуже, чем в C#:
std::format("At {1}, the temperature is {0}°C.", std::chrono::utc_clock::now(), 20.4);
Только в C# допускается не более трех параметров, и тип у этих параметров — System.Object (почти как void*). А если нужно число параметров больше трех, то придется костылить массив (опять же System.Object). В С++ все как-то более стройно, обобщенно и секьюрно получается.
Здравствуйте, watchmaker, Вы писали:
W>
W>в https://en.cppreference.com/w/cpp/compiler_support/20 зелёных кубиков больше одного.
W>это та функциональность, которая реализована только в библиотеке, и не затрагивает компилятор. Это означает, что наличие и работоспособность std::format определяется не им, а используемой реализацией стандартной библиотеки. Например, я могу собирать проект с libc++, и std::format сразу же становится доступным в msvc, g++, clang, ну и в других компиляторах, где есть поддержка core c++20.
W>
проверил, да, clang-cl, который идет в поставке vs2022, тоже поддерживает, хотя интеллисенс подчеркивает что в нэймспейсе std нет функции format.
однако clang++16, что на офсайте, не содержит заголовка format.
А ведь эта фича, которая прямо в первой главе в книгах по c++20 описывается