std::formatted_size
From cppreference.com
| 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, std::format_string<Args...> fmt, Args&&... args ); |
(3) | (since C++20) |
template< class... Args > std::size_t formatted_size( const std::locale& loc, std::wformat_string<Args...> fmt, Args&&... args ); |
(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.
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 | ||||||||||||||||||||||||||||||||||||||||||||||
Return value
The total number of characters in the formatted string.
Exceptions
Propagates any exception thrown by formatter.
Example
Run this code
#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."
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
|
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) |