Difference between revisions of "cpp/utility/format/formatted size"
(Thnx! Somehow i've mist the point that ~ "ab"sv.size()=="ab\0cd"sv.size()==2 .)) |
m (fmt.) |
||
(8 intermediate revisions by 5 users not shown) | |||
Line 3: | Line 3: | ||
{{dcl begin}} | {{dcl begin}} | ||
− | {{dcl header | format }} | + | {{dcl header|format}} |
− | {{dcl | num=1 | since=c++20 |1= | + | {{dcl|num=1|since=c++20|1= |
− | template<class... Args> | + | template< class... Args > |
− | std::size_t formatted_size(std:: | + | std::size_t formatted_size( std::format_string<Args...> fmt, Args&&... args ); |
}} | }} | ||
− | {{dcl | num=2 | since=c++20 |1= | + | {{dcl|num=2|since=c++20|1= |
− | template<class... Args> | + | template< class... Args > |
− | std::size_t formatted_size(std:: | + | std::size_t formatted_size( std::wformat_string<Args...> fmt, Args&&... args ); |
}} | }} | ||
− | {{dcl | num=3 | since=c++20 |1= | + | {{dcl|num=3|since=c++20|1= |
− | template<class... Args> | + | template< class... Args > |
− | std::size_t formatted_size(const std::locale& loc, std:: | + | std::size_t formatted_size( const std::locale& loc, |
+ | std::format_string<Args...> fmt, Args&&... args ); | ||
}} | }} | ||
− | {{dcl | num=4 | since=c++20 |1= | + | {{dcl|num=4|since=c++20|1= |
− | template<class... Args> | + | template< class... Args > |
− | std::size_t formatted_size(const std::locale& loc, std:: | + | std::size_t formatted_size( const std::locale& loc, |
+ | std::wformat_string<Args...> fmt, Args&&... args ); | ||
}} | }} | ||
{{dcl end}} | {{dcl end}} | ||
− | Determine the total number of characters in the formatted string by formatting {{ | + | Determine the total number of characters in the formatted string by formatting {{c|args}} according to the format string {{c|fmt}}. If present, {{c|loc}} is used for locale-specific formatting. |
− | The behavior is undefined if {{c|std::formatter<Ti, CharT>}} does not meet the {{named req| | + | The behavior is undefined if {{c|std::formatter<std::remove_cvref_t<Ti>, CharT>}} does not meet the {{named req|BasicFormatter}} requirements for any {{tt|Ti}} in {{tt|Args}}. |
===Parameters=== | ===Parameters=== | ||
{{par begin}} | {{par begin}} | ||
− | {{par | fmt | | + | {{par|fmt|{{cpp/utility/format/format string|const}}}} |
− | {{cpp/utility/format/format string}} | + | {{par|args...|arguments to be formatted}} |
− | }} | + | {{par|loc|{{lc|std::locale}} used for locale-specific formatting}} |
− | {{par | args... | arguments to be formatted}} | + | |
− | {{par | loc | {{lc|std::locale}} used for locale-specific formatting}} | + | |
{{par end}} | {{par end}} | ||
Line 39: | Line 39: | ||
===Exceptions=== | ===Exceptions=== | ||
− | + | Propagates any exception thrown by formatter. | |
===Example=== | ===Example=== | ||
− | {{example | + | {{example |
− | + | |code= | |
#include <format> | #include <format> | ||
+ | #include <iomanip> | ||
#include <iostream> | #include <iostream> | ||
+ | #include <string_view> | ||
#include <vector> | #include <vector> | ||
− | |||
int main() | int main() | ||
Line 53: | Line 54: | ||
using namespace std::literals::string_view_literals; | using namespace std::literals::string_view_literals; | ||
− | constexpr auto fmt_str { "Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv }; | + | constexpr auto fmt_str{"Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv}; |
− | constexpr auto sub_zero { " | + | constexpr auto sub_zero{"\N{SUBSCRIPT ZERO}"sv}; // "₀" or {0342, 130, 128} |
− | constexpr auto aprox_equ { " | + | constexpr auto aprox_equ{"\N{APPROXIMATELY EQUAL TO}"sv}; // "≅" or {0342, 137, 133} |
− | constexpr int Ho { 42 }; // H₀ | + | constexpr int Ho{42}; // H₀ |
− | + | ||
− | + | ||
− | + | ||
+ | const auto min_buffer_size{std::formatted_size(fmt_str, sub_zero, aprox_equ, Ho)}; | ||
std::cout << "Min buffer size = " << min_buffer_size << '\n'; | std::cout << "Min buffer size = " << min_buffer_size << '\n'; | ||
− | // Use std::vector as dynamic buffer. | + | // Use std::vector as dynamic buffer. The buffer does not include the trailing '\0'. |
− | std::vector<char> buffer(min_buffer_size); | + | std::vector<char> buffer(min_buffer_size); |
std::format_to_n(buffer.data(), buffer.size(), fmt_str, sub_zero, aprox_equ, Ho); | std::format_to_n(buffer.data(), buffer.size(), fmt_str, sub_zero, aprox_equ, Ho); | ||
+ | std::cout << "Buffer: " | ||
+ | << std::quoted(std::string_view{buffer.data(), min_buffer_size}) | ||
+ | << '\n'; | ||
− | + | // Print the buffer directly after adding the trailing '\0'. | |
− | + | ||
− | // | + | |
buffer.push_back('\0'); | buffer.push_back('\0'); | ||
− | std::cout << "Buffer: | + | std::cout << "Buffer: " << std::quoted(buffer.data()) << '\n'; |
} | } | ||
− | + | |output= | |
Min buffer size = 37 | Min buffer size = 37 | ||
Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc." | Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc." | ||
Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc." | Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc." | ||
}} | }} | ||
+ | |||
+ | ===Defect reports=== | ||
+ | {{dr list begin}} | ||
+ | {{dr list item|paper=P2216R3|std=C++20|before=throws {{lc|std::format_error}} for invalid format string|after=invalid format string results in compile-time error}} | ||
+ | {{dr list item|paper=P2418R2|std=C++20|before=objects that are neither const-usable nor copyable<br>(such as generator-like objects) are not formattable|after=allow formatting these objects}} | ||
+ | {{dr_p2508}} | ||
+ | {{dr list end}} | ||
===See also=== | ===See also=== | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/utility/format/dsc format_to}} | + | {{dsc inc|cpp/utility/format/dsc format_to}} |
− | {{dsc inc | cpp/utility/format/dsc format_to_n}} | + | {{dsc inc|cpp/utility/format/dsc format_to_n}} |
{{dsc end}} | {{dsc end}} | ||
− | {{langlinks|ja|zh}} | + | {{langlinks|es|ja|ru|zh}} |
Latest revision as of 13:08, 9 July 2024
Defined in header <format>
|
||
template< class... Args > std::size_t formatted_size( std::format_string<Args...> fmt, Args&&... args ); |
(1) | (since C++20) |
template< class... Args > std::size_t formatted_size( std::wformat_string<Args...> fmt, Args&&... args ); |
(2) | (since C++20) |
template< class... Args > std::size_t formatted_size( const std::locale& loc, |
(3) | (since C++20) |
template< class... Args > std::size_t formatted_size( const std::locale& loc, |
(4) | (since C++20) |
Determine the total number of characters in the formatted string by formatting args according to the format string fmt. If present, loc is used for locale-specific formatting.
The behavior is undefined if std::formatter<std::remove_cvref_t<Ti>, CharT> does not meet the BasicFormatter requirements for any Ti
in Args
.
Contents |
[edit] Parameters
fmt | - | an object that represents the format string. The format string consists of
Each replacement field has the following format:
1) replacement field without a format specification
2) replacement field with a format specification
| ||||||||||||||||||||||||||||||||||||||||||||||
args... | - | arguments to be formatted | ||||||||||||||||||||||||||||||||||||||||||||||
loc | - | std::locale used for locale-specific formatting |
[edit] Return value
The total number of characters in the formatted string.
[edit] Exceptions
Propagates any exception thrown by formatter.
[edit] Example
#include <format> #include <iomanip> #include <iostream> #include <string_view> #include <vector> int main() { using namespace std::literals::string_view_literals; constexpr auto fmt_str{"Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv}; constexpr auto sub_zero{"\N{SUBSCRIPT ZERO}"sv}; // "₀" or {0342, 130, 128} constexpr auto aprox_equ{"\N{APPROXIMATELY EQUAL TO}"sv}; // "≅" or {0342, 137, 133} constexpr int Ho{42}; // H₀ const auto min_buffer_size{std::formatted_size(fmt_str, sub_zero, aprox_equ, Ho)}; std::cout << "Min buffer size = " << min_buffer_size << '\n'; // Use std::vector as dynamic buffer. The buffer does not include the trailing '\0'. std::vector<char> buffer(min_buffer_size); std::format_to_n(buffer.data(), buffer.size(), fmt_str, sub_zero, aprox_equ, Ho); std::cout << "Buffer: " << std::quoted(std::string_view{buffer.data(), min_buffer_size}) << '\n'; // Print the buffer directly after adding the trailing '\0'. buffer.push_back('\0'); std::cout << "Buffer: " << std::quoted(buffer.data()) << '\n'; }
Output:
Min buffer size = 37 Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc." Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P2216R3 | C++20 | throws std::format_error for invalid format string | invalid format string results in compile-time error |
P2418R2 | C++20 | objects that are neither const-usable nor copyable (such as generator-like objects) are not formattable |
allow formatting these objects |
P2508R1 | C++20 | there's no user-visible name for this facility | the name basic_format_string is exposed
|
[edit] See also
(C++20) |
writes out formatted representation of its arguments through an output iterator (function template) |
(C++20) |
writes out formatted representation of its arguments through an output iterator, not exceeding specified size (function template) |