名前空間
変種
操作

std::format_to_n, std::format_to_n_result

From cppreference.com
< cpp‎ | utility‎ | format
 
 
 
 
ヘッダー <format> で定義
template< class OutputIt, class... Args >

std::format_to_n_result<OutputIt>
    format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n,

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

std::format_to_n_result<OutputIt>
    format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n,

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

std::format_to_n_result<OutputIt>
    format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n,
                 const std::locale& loc,

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

std::format_to_n_result<OutputIt>
    format_to_n( OutputIt out, std::iter_difference_t<OutputIt> n,
                 const std::locale& loc,

                 std::wformat_string<Args...> fmt, Args&&... args );
(4) (C++20以降)
ヘルパー型
template< class OutputIt >

struct format_to_n_result {
    OutputIt out;
    std::iter_difference_t<OutputIt> size;

};
(5) (C++20以降)

フォーマット文字列 fmt に従って引数 args をフォーマットし、結果を出力イテレータ out に書き込みます。最大 n 文字まで書き込まれます。指定されている場合、loc はロケール固有のフォーマットに使用されます。

オーバーロード (1,3) では char 、オーバーロード (2,4) では wchar_tCharT とします。

これらのオーバーロードは、 OutputIt がコンセプト std::output_iterator<const CharT&> を満たす場合にのみ、オーバーロード解決に参加します。

OutputIt がコンセプト std::output_iterator<const CharT&> の意味的要件を満たさない場合、または Args 内の任意の Ti に対して std::formatter<std::remove_cvref_t<Ti>, CharT>BasicFormatter 要件を満たさない場合、振る舞いは未定義です。

5) std::format_to_n_result は基底クラスを持たず、 outsize 、および暗黙的に宣言された特殊メンバ関数以外のメンバを持ちません。

目次

[編集] パラメータ

out - 出力バッファへのイテレータ
n - バッファに書き込む文字数の最大値
fmt - フォーマット文字列を表すオブジェクト。フォーマット文字列は以下で構成される:
  • 通常の文字({} を除く)は、変更されずに出力にコピーされる。
  • エスケープシーケンス {{}} は、それぞれ出力で {} に置き換えられる。
  • 置換フィールド。

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

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

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

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

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

[編集] 戻り値

format_to_n_result。その out メンバは出力範囲の末尾の次を指すイテレータであり、 size メンバは合計(切り詰められていない)出力サイズです。

[編集] 例外

フォーマッタまたはイテレータ操作によってスローされた例外を伝播します。

[編集] 注記

GCC-13.3 より前の libstdc++ の実装には、 format_to_n_result::out の正しい値を報告する際の バグがありました。

[編集]

Godbolt's Compiler Explorer で: clang (trunk) + libc++GCC (trunk) + libstdc++

#include <format>
#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <string_view>
 
int main()
{
    char buffer[64];
 
    for (std::size_t max_chars_to_write : {std::size(buffer) - 1, 23uz, 21uz})
    {
        const std::format_to_n_result result =
            std::format_to_n(
                buffer, max_chars_to_write,
                "Hubble's H{2} {3} {0}{4}{1} km/sec/Mpc.", // 24 bytes w/o formatters
                71,       // {0}, occupies 2 bytes
                8,        // {1}, occupies 1 byte
                "\u2080", // {2}, occupies 3 bytes, '₀' (SUBSCRIPT ZERO)
                "\u2245", // {3}, occupies 3 bytes, '≅' (APPROXIMATELY EQUAL TO)
                "\u00B1"  // {4}, occupies 2 bytes, '±' (PLUS-MINUS SIGN)
                ); // 24 + 2 + 1 + 3 + 3 + 2 == 35, no trailing '\0'
 
        *result.out = '\0'; // adds terminator to buffer
 
        const std::string_view str(buffer, result.out);
 
        std::cout << "Buffer until '\\0': " << std::quoted(str) << '\n'
                  << "Max chars to write: " << max_chars_to_write << '\n'
                  << "result.out offset: " << result.out - buffer << '\n'
                  << "Untruncated output size: " << result.size << "\n\n";
    }
}

出力

Buffer until '\0': "Hubble's H₀ ≅ 71±8 km/sec/Mpc."
Max chars to write: 63
result.out offset: 35
Untruncated output size: 35
 
Buffer until '\0': "Hubble's H₀ ≅ 71±8"
Max chars to write: 23
result.out offset: 23
Untruncated output size: 35
 
Buffer until '\0': "Hubble's H₀ ≅ 71�"
Max chars to write: 21
result.out offset: 21
Untruncated output size: 35

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
P2216R3 C++20 無効なフォーマット文字列に対して std::format_error をスローします。 無効なフォーマット文字列はコンパイル時エラーになります。
P2418R2 C++20 const-usableでもコピー可能でもないオブジェクト
(ジェネレータのようなオブジェクトなど)はフォーマットできない
これらのオブジェクトのフォーマットを許可する
P2508R1 C++20 この機能にはユーザーから見える名前がない basic_format_stringという名前が公開された

[編集] 関連項目

(C++20)
引数のフォーマット済み表現を新しい文字列に格納する
(関数テンプレート) [編集]
(C++20)
引数のフォーマット済み表現を出力イテレータを介して書き出す
(関数テンプレート) [編集]
引数のフォーマット済み表現を格納するために必要な文字数を決定する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)