std::format_to_n, std::format_to_n_result
| ヘッダー <format> で定義 |
||
| template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(1) | (C++20以降) |
| template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(2) | (C++20以降) |
| template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(3) | (C++20以降) |
| template< class OutputIt, class... Args > std::format_to_n_result<OutputIt> |
(4) | (C++20以降) |
| ヘルパー型 |
||
| template< class OutputIt > struct format_to_n_result { |
(5) | (C++20以降) |
フォーマット文字列 fmt に従って引数 args をフォーマットし、結果を出力イテレータ out に書き込みます。最大 n 文字まで書き込まれます。指定されている場合、loc はロケール固有のフォーマットに使用されます。
オーバーロード (1,3) では char 、オーバーロード (2,4) では wchar_t を CharT とします。
これらのオーバーロードは、 OutputIt がコンセプト std::output_iterator<const CharT&> を満たす場合にのみ、オーバーロード解決に参加します。
OutputIt がコンセプト std::output_iterator<const CharT&> の意味的要件を満たさない場合、または Args 内の任意の Ti に対して std::formatter<std::remove_cvref_t<Ti>, CharT> が BasicFormatter 要件を満たさない場合、振る舞いは未定義です。
std::format_to_n_result は基底クラスを持たず、 out 、 size 、および暗黙的に宣言された特殊メンバ関数以外のメンバを持ちません。目次 |
[編集] パラメータ
| out | - | 出力バッファへのイテレータ | ||||||||||||||||||||||||||||||||||||||||||||||
| n | - | バッファに書き込む文字数の最大値 | ||||||||||||||||||||||||||||||||||||||||||||||
| fmt | - |
各置換フィールドは以下の形式を持つ。
1) フォーマット指定なしの置換フィールド
2) フォーマット指定ありの置換フィールド
| ||||||||||||||||||||||||||||||||||||||||||||||
| 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) |
引数のフォーマット済み表現を出力イテレータを介して書き出す (関数テンプレート) |
| (C++20) |
引数のフォーマット済み表現を格納するために必要な文字数を決定する (関数テンプレート) |