std::formatted_size(3)

NAME
std::formatted_size - std::formatted_size

Synopsis
   Defined in header <format>
   template< class... Args >
   std::size_t formatted_size( std::format_string<Args...> fmt, (1) (since C++20)
   Args&&... args );
   template< class... Args >
   std::size_t formatted_size( std::wformat_string<Args...> fmt, (2) (since C++20)
   Args&&... args );
   template< class... Args >
   std::size_t formatted_size( const std::locale& loc, (3) (since C++20)
                        std::format_string<Args...> fmt,
   Args&&... args );
   template< class... Args >
   std::size_t formatted_size( const std::locale& loc, (4) (since C++20)
                        std::wformat_string<Args...> fmt,
   Args&&... args );
   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
             an object that represents the format string. The format string consists of
               * ordinary characters (except { and }), which are copied unchanged to
                 the output,
               * escape sequences {{ and }}, which are replaced with { and }
                 respectively in the output, and
               * replacement fields.
             Each replacement field has the following format:
             { arg-id (optional) } (1)
             { arg-id (optional) : format-spec } (2)
             1) replacement field without a format specification
             2) replacement field with a format specification
                        specifies the index of the argument in args whose value is
                        to be used for formatting; if it is omitted, the arguments
                        are used in order.
             arg-id -
                        The arg-id s in a format string must all be present or all
                        be omitted. Mixing manual and automatic indexing is an
                        error.
   fmt - the format specification defined by the std::formatter
             format-spec - specialization for the corresponding argument. Cannot start
                        with }.
               * For basic types and standard string types, the format specification is
                 interpreted as standard format specification.
               * For chrono types, the format specification is interpreted as chrono
                 format specification.
               * For range types, the format specification is interpreted
                 as range format specification.
               * For std::pair and std::tuple, the format specification
                 is interpreted as tuple format specification.
               * For std::thread::id and std::stacktrace_entry, see (since C++23)
                 thread id format specification and stacktrace entry
                 format specification.
               * For std::basic_stacktrace, no format specifier is
                 allowed.
               * For std::filesystem::path, see path format (since C++26)
                 specification.
               * For other formattable types, the format specification is determined by
                 user-defined formatter specializations.
   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 <iostream>
 #include <vector>
 #include <string_view>
 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 { "₀"sv }; // { "\u2080"sv } => { 0xe2, 0x82, 0x80 };
     constexpr auto aprox_equ { "≅"sv }; // { "\u2245"sv } => { 0xe2, 0x89, 0x85 };
     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. Note: 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::string_view{buffer.data(), min_buffer_size} << "\"\n";
     // Or we can print the buffer directly by adding the trailing '\0'.
     buffer.push_back('\0');
     std::cout << "Buffer: \"" << 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 results in
                      invalid format string compile-time error
                      objects that are neither
   P2418R2 C++20 const-usable nor copyable allow formatting these objects
                      (such as generator-like objects)
                      are not formattable
   P2508R1 C++20 there's no user-visible name for the name basic_format_string is
                      this facility exposed

See also
   format_to writes out formatted representation of its arguments through an output
   (C++20) iterator
               (function template)
   format_to_n writes out formatted representation of its arguments through an output
   (C++20) iterator, not exceeding specified size
               (function template)