名前空間
変種
操作

フォーマットライブラリ (C++20 から)

From cppreference.com
< cpp‎ | utility
 
 
 
 

テキストフォーマットライブラリは、printfファミリ関数に代わる、安全で拡張可能な代替手段を提供します。これは、既存のC++ I/Oストリームライブラリを補完することを目的としています。

目次

[編集] フォーマット指定

フォーマット指定は、オブジェクトがさまざまな種類のオプションでどのようにフォーマットされるかを指定します。

基本型および標準文字列型のオブジェクトのフォーマットには、基本フォーマット指定が使用されます。他のライブラリコンポーネントも独自のフォーマット指定を提供することがあります。詳細はこちらを参照してください。

[編集] フォーマット関数

ヘッダー <format> で定義
(C++20)
引数のフォーマット済み表現を新しい文字列に格納する
(関数テンプレート) [編集]
(C++20)
引数のフォーマット済み表現を出力イテレータを介して書き出す
(関数テンプレート) [編集]
指定されたサイズを超えないように、引数のフォーマット済み表現を出力イテレータを介して書き出す
(関数テンプレート) [編集]
引数のフォーマット済み表現を格納するために必要な文字数を決定する
(関数テンプレート) [編集]

[編集] フォーマット文字列

ヘッダー <format> で定義
構築時にコンパイル時フォーマット文字列チェックを実行するクラステンプレート
(クラステンプレート) [編集]
ユーザー指向のフォーマット関数で直接使用可能な実行時フォーマット文字列を作成する
(関数) [編集]

[編集] フォーマット関連コンセプト

ヘッダー <format> で定義
型がフォーマット可能であること、つまり std::formatter を特殊化し、メンバ関数 parse および format を提供することを指定する
(コンセプト) [編集]

[編集] 拡張性サポートと実装詳細

ヘッダー <format> で定義
(C++20)
型消去された引数表現を使用する std::format の非テンプレート版
(関数) [編集]
型消去された引数表現を使用する std::format_to の非テンプレート版
(関数テンプレート) [編集]
format_args に変換可能な、すべてのフォーマット引数を参照する型消去されたオブジェクトを作成する
(関数テンプレート) [編集]
(C++20) (C++26で非推奨)
ユーザー定義フォーマッタのための引数訪問インターフェース
(関数テンプレート) [編集]
(C++20)
与えられた型のフォーマット規則を定義する
(クラステンプレート) [編集]
範囲型の std::formatter 特殊化の実装を助けるクラステンプレート
(クラステンプレート) [編集]
引数型が効率的に出力できることを示す
(変数テンプレート)[編集]
範囲をどのようにフォーマットするかを指定する
(enum) [編集]
範囲に適した std::range_format を選択する
(変数テンプレート)[編集]
ユーザー定義フォーマッタのためにフォーマット引数へのアクセスを提供するクラステンプレート
(クラステンプレート) [編集]
すべてのフォーマット引数へのアクセスを提供するクラス
(クラステンプレート) [編集]
すべてのフォーマット引数と出力イテレータを含むフォーマット状態
(クラステンプレート) [編集]
フォーマット文字列パーサの状態
(クラステンプレート) [編集]
フォーマットエラー時にスローされる例外型
(クラス) [編集]

[編集] ヘルパー項目 (C++23から)

template< class R, class CharT >

concept /*const-formattable-range*/ =
    ranges::input_range<const R> &&

    std::formattable<ranges::range_reference_t<const R>, CharT>;
(1) (説明用*)
template< class R, class CharT >

using /*fmt-maybe-const*/ =

    std::conditional_t</*const-formattable-range*/<R, CharT>, const R, R>;
(2) (説明用*)

[編集] 注釈

機能テストマクロ 規格 機能
__cpp_lib_format 201907L (C++20) テキストフォーマット
202106L (C++23)
(DR20)
コンパイル時フォーマット文字列チェック;
std::vformat_toのパラメータ化の削減
202110L (C++23)
(DR20)
chronoフォーマッタにおけるロケール処理の修正;
const-formattableでない型のサポート
202207L (C++23)
(DR20)
std::basic_format_stringの公開;
chrono型のローカライズされたフォーマットにおけるエンコーディングの取り扱いの明確化
202304L (C++26) ポインタのフォーマット
202305L (C++26) フォーマット引数の型チェック
202306L (C++26) メンバ std::basic_format_arg::visit
202311L (C++26) 実行時フォーマット文字列
202403L (C++26) std::printlnによる空行の出力
202403L (C++26)
(DR23)
std::printの効率的な実装を許可
__cpp_lib_format_ranges 202207L (C++23) 範囲のフォーマット
__cpp_lib_format_path 202403L (C++26) std::filesystem::pathのフォーマット
__cpp_lib_format_uchar 202311L (C++26) コードユニットの整数としてのフォーマットを修正
__cpp_lib_formatters 202302L (C++23) std::thread::idstd::stacktrace のフォーマット

我々は意図的に、std::basic_format_string の追加(P2508)を欠陥報告として扱います。なぜなら、公式にはそう分類されていませんが、既知のすべての実装がこれらのコンポーネントをC++20モードで利用可能にしているためです。

[編集]

#include <cassert>
#include <format>
 
int main()
{
    std::string message = std::format("The answer is {}.", 42);
    assert(message == "The answer is 42.");
}

[編集] 欠陥報告

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

DR 適用対象 公開された動作 正しい動作
P2418R2 C++20 const-formattableでもコピー可能でもないオブジェクト
(ジェネレータのようなオブジェクトなど)はフォーマットできない
これらのオブジェクトのフォーマットを許可する
(フォーマッタ要件の緩和)
P2508R1 C++20 この機能にはユーザーから見える名前がない basic_format_stringという名前が公開された

[編集] 関連項目

(C++23)
引数のフォーマット済み表現を用いて stdout またはファイルストリームに出力する
(関数テンプレート) [編集]
(C++23)
std::printと同じだが、各出力の末尾に改行が追加される点が異なる
(関数テンプレート) [編集]
引数のフォーマット済み表現を出力する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)