Namespaces
Variants

Formatting library (since C++20)

From cppreference.net

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

目次

フォーマット仕様

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

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

フォーマット関数

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

フォーマット文字列

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

フォーマット概念

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

拡張性サポートと実装詳細

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

ヘルパーアイテム (since 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フォーマット可能な型のサポート
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::id std::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でもcopyableでもないオブジェクト
(ジェネレータのようなオブジェクト)はformattableではない
これらのオブジェクトのフォーマットを許可
(フォーマッタ要件の緩和)
P2508R1 C++20 この機能に対するユーザー可視名が存在しない basic_format_string という名前が公開される

関連項目

(C++23)
引数の フォーマット済み 表現を使用して stdout またはファイルストリームに出力する
(関数テンプレート)
(C++23)
std::print と同じだが、各出力が追加の改行で終了する
(関数テンプレート)
引数の フォーマット済み 表現を出力する
(関数テンプレート)