Namespaces
Variants

std:: formatted_size

From cppreference.net
ヘッダーで定義 <format>
template < class ... Args >
std:: size_t formatted_size ( std:: format_string < Args... > fmt, Args && ... args ) ;
(1) (C++20以降)
template < class ... Args >
std:: size_t formatted_size ( std:: wformat_string < Args... > fmt, Args && ... args ) ;
(2) (C++20以降)
template < class ... Args >

std:: size_t formatted_size ( const std:: locale & loc,

std:: format_string < Args... > fmt, Args && ... args ) ;
(3) (C++20以降)
template < class ... Args >

std:: size_t formatted_size ( const std:: locale & loc,

std:: wformat_string < Args... > fmt, Args && ... args ) ;
(4) (C++20以降)

フォーマット文字列 fmt に従って args をフォーマットした結果の文字列の総文字数を決定します。存在する場合、 loc はロケール固有のフォーマットに使用されます。

Args 内のいずれかの Ti について std:: formatter < std:: remove_cvref_t < Ti > , CharT > BasicFormatter 要件を満たさない場合、動作は未定義です。

目次

パラメータ

fmt - フォーマット文字列を表すオブジェクト。フォーマット文字列は以下から構成される:
  • 通常の文字( { } を除く) - 出力に変更されずコピーされる
  • エスケープシーケンス { { } } - 出力ではそれぞれ { } に置換される
  • 置換フィールド

各置換フィールドは以下の形式を持つ:

{ arg-id (optional) } (1)
{ arg-id (optional) : format-spec } (2)
1) フォーマット指定なしの置換フィールド
2) フォーマット指定ありの置換フィールド
arg-id - フォーマットに使用する args 内の引数のインデックスを指定する。省略された場合、引数は順番に使用される。

フォーマット文字列内の arg-id はすべて存在するか、すべて省略されなければならない。手動インデックスと自動インデックスの混合はエラーである。

format-spec - 対応する引数に対する std::formatter 特殊化によって定義されるフォーマット仕様。 } で始めることはできない。

(C++23以降)
(C++26以降)
  • その他のフォーマット可能な型の場合、フォーマット仕様はユーザー定義の formatter 特殊化によって決定される。
args... - フォーマットされる引数
loc - ロケール固有のフォーマットに使用される std::locale

戻り値

フォーマットされた文字列の総文字数。

例外

formatterによってスローされた例外を伝播します。

#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';
}

出力:

Min buffer size = 37
Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."
Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR Applied to Behavior as published Correct behavior
P2216R3 C++20 不正なフォーマット文字列に対して std::format_error をスロー 不正なフォーマット文字列はコンパイル時エラーとなる
P2418R2 C++20 const-usableでもcopyableでもないオブジェクト
(ジェネレーターのようなオブジェクト)はフォーマット不可
これらのオブジェクトのフォーマットを許可
P2508R1 C++20 この機能に対するユーザー可視の名前が存在しない 名前 basic_format_string が公開される

関連項目

(C++20)
引数の書式化された表現を出力イテレータを通して書き出す
(関数テンプレート)
引数の書式化された表現を出力イテレータを通して書き出す(指定されたサイズを超えない)
(関数テンプレート)