Scroll to navigation

std::formatted_size(3) C++ Standard Libary std::formatted_size(3)

NAME

std::formatted_size - std::formatted_size

Synopsis


Defined in header <format>
template< class... Args >
std::size_t formatted_size( /*format_string<Args...>*/ fmt, (1) (since C++20)
Args&&... args );
template< class... Args >
std::size_t formatted_size( /*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)


/*format_string<Args...>*/ fmt, Args&&... args );
template< class... Args >


std::size_t formatted_size( const std::locale& loc, (4) (since C++20)


/*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


parameter of unspecified type, whose initialization is valid only if the
argument is convertible to std::string_view (for (1,3)) or
std::wstring_view (for (2,4)), and the result of conversion is a constant
expression and a valid format string for Args. 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)


fmt - 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
arg-id - are used in order.


The arg-ids in a format string must all be present or all be
omitted. Mixing manual and automatic indexing is an error.
format-spec - the format specification defined by the std::formatter
specialization for the corresponding argument.


* 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 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
throws std::format_error for invalid invalid format string
P2216R3 C++20 format string results in compile-time
error
objects that are neither const-usable nor
P2418R2 C++20 copyable allow formatting these
(such as generator-like objects) are not objects
formattable

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)

2022.07.31 http://cppreference.com