Аналог String.Format из c#
От: maks1180  
Дата: 25.10.22 17:15
Оценка:
В c# можно делать так: String.Format("At {1}, the temperature is {0}°C.", DateTime.Now, 20.4);
Это нужно для трансляции UI в разные языки, так как в разных язык может использовать разная последовательность аргументов.
Что-бы код не менять из-за этого, а указывать номер агрумента в шаблоне формата.
Нужен аналог в с++.
Мне кажеться, что принципиально нельзя это сделать в с++, так как что-бы добраться до 2-го элемента, нужно знать размер 1-го, а если он не указан в шаблоне, то не получиться.
Или я не прав ?
===============================================
(реклама, удалена модератором)
Re: std::format
От: Qbit86 Кипр
Дата: 25.10.22 17:30
Оценка:
Здравствуйте, 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
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: std::format
От: wl. Россия  
Дата: 28.10.22 13:01
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>https://en.cppreference.com/w/cpp/utility/format/format


это c++20, а реализовано только в MSVC, насколько я знаю. Есть аналог: https://fmt.dev/latest/index.html
Re[3]: std::format
От: watchmaker  
Дата: 28.10.22 14:24
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Здравствуйте, Qbit86, Вы писали:


Q>>https://en.cppreference.com/w/cpp/utility/format/format


wl.>это c++20, а реализовано только в MSVC, насколько я знаю.

  1. в https://en.cppreference.com/w/cpp/compiler_support/20 зелёных кубиков больше одного.
  2. это та функциональность, которая реализована только в библиотеке, и не затрагивает компилятор. Это означает, что наличие и работоспособность std::format определяется не им, а используемой реализацией стандартной библиотеки. Например, я могу собирать проект с libc++, и std::format сразу же становится доступным в msvc, g++, clang, ну и в других компиляторах, где есть поддержка core c++20.
Re: Аналог String.Format из c#
От: Iso12  
Дата: 30.10.22 16:45
Оценка:
Здравствуйте, maks1180, Вы писали:

M>В c# можно делать так: String.Format("At {1}, the temperature is {0}°C.", DateTime.Now, 20.4);


stringstream не смотрели? Может поможет.
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 . Предыдущая версия .
Re[4]: std::format
От: wl. Россия  
Дата: 31.10.22 14:24
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>

    W>
  1. в https://en.cppreference.com/w/cpp/compiler_support/20 зелёных кубиков больше одного.
    W>
  2. это та функциональность, которая реализована только в библиотеке, и не затрагивает компилятор. Это означает, что наличие и работоспособность std::format определяется не им, а используемой реализацией стандартной библиотеки. Например, я могу собирать проект с libc++, и std::format сразу же становится доступным в msvc, g++, clang, ну и в других компиляторах, где есть поддержка core c++20.
    W>

проверил, да, clang-cl, который идет в поставке vs2022, тоже поддерживает, хотя интеллисенс подчеркивает что в нэймспейсе std нет функции format.
однако clang++16, что на офсайте, не содержит заголовка format.
А ведь эта фича, которая прямо в первой главе в книгах по c++20 описывается
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.