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

Сообщение Re: Аналог String.Format из c# от 30.10.2022 21:27

Изменено 30.10.2022 21:36 rg45

Re: Аналог String.Format из c#
Здравствуйте, 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++ обеспечивает непосредственный доступ к параметрам фунции в произвольном порядке? Дело тут вовсе не в технической невозможности. В стандартной библиотеке С++ долгое время не было утилит форматирования, потому что в нее не хотели тянуть Си-шный механизм функций с переменным числом параметров, поскольку он подрывает одну из основ С++ — типовую безопасность. И только с появлением в С++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*). Вся типовая безопасность принесена в жертву синтаксическому кариесу. А если нужно число параметров больше трех, то придется мастерить массив объектов. Костыли для калек, короче.
Re: Аналог String.Format из c#
Здравствуйте, 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*). Типовая безопасность принесена в жертву синтаксическому кариесу. А если нужно число параметров больше трех, то придется мастерить массив объектов. Костыли для калек, короче.