Re: Аналог String.Format из c#
От: rg45 СССР  
Дата: 30.10.22 21:27
Оценка:
Здравствуйте, 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). В С++ все как-то более стройно, обобщенно и секьюрно получается.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 31.10.2022 8:17 rg45 . Предыдущая версия . Еще …
Отредактировано 30.10.2022 23:02 rg45 . Предыдущая версия .
Отредактировано 30.10.2022 23:00 rg45 . Предыдущая версия .
Отредактировано 30.10.2022 22:02 rg45 . Предыдущая версия .
Отредактировано 30.10.2022 21:44 rg45 . Предыдущая версия .
Отредактировано 30.10.2022 21:36 rg45 . Предыдущая версия .
Отредактировано 30.10.2022 21:34 rg45 . Предыдущая версия .
Отредактировано 30.10.2022 21:31 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.