名稱空間
變體
操作

格式化庫 (C++20 起)

來自 cppreference.com
< cpp‎ | 工具
 
 
 
 

文字格式化庫提供了一種安全且可擴充套件的替代方案,以取代 printf 系列函式。它旨在補充現有的 C++ I/O 流庫。

目錄

[編輯] 格式規範

格式規範指定了物件如何以不同型別的選項進行格式化。

基本型別和標準字串型別的物件格式化使用基本格式規範。其他庫元件也可能提供自己的格式規範,詳見此處

[編輯] 格式化函式

定義於標頭檔案 <format>
(C++20)
將引數的格式化表示儲存在新字串中
(函式模板) [編輯]
(C++20)
透過輸出迭代器寫出其引數的格式化表示
(函式模板) [編輯]
透過輸出迭代器寫出其引數的格式化表示,不超過指定大小
(函式模板) [編輯]
確定儲存其引數格式化表示所需的字元數
(函式模板) [編輯]

[編輯] 格式字串

定義於標頭檔案 <format>
在構造時執行編譯時格式字串檢查的類模板
(類模板) [編輯]
建立可直接用於面向使用者的格式化函式的執行時格式字串
(函式) [編輯]

[編輯] 格式化概念

定義於標頭檔案 <format>
指定一個型別是可格式化的,即它專門化了 std::formatter 並提供了成員函式 parseformat
(概念) [編輯]

[編輯] 可擴充套件性支援和實現細節

定義於標頭檔案 <format>
(C++20)
使用型別擦除引數表示的 std::format 的非模板變體
(函式) [編輯]
使用型別擦除引數表示的 std::format_to 的非模板變體
(函式模板) [編輯]
建立引用所有格式化引數的型別擦除物件,可轉換為 format_args
(函式模板) [編輯]
(C++20) (在 C++26 中廢棄)
使用者定義格式化器的引數訪問介面
(函式模板) [編輯]
(C++20)
定義給定型別的格式化規則
(類模板) [編輯]
有助於實現範圍型別的 std::formatter 特化的類模板
(類模板) [編輯]
指示引數型別可以高效列印
(變數模板)[編輯]
指定範圍應如何格式化
(列舉) [編輯]
為範圍選擇合適的 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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
P2418R2 C++20 既不可 const-formattable 也不可複製的物件
(例如生成器類物件) 不可格式化
允許格式化這些物件
(放寬格式化器要求)
P2508R1 C++20 該功能沒有使用者可見的名稱 公開了名稱 basic_format_string

[編輯] 另請參見

(C++23)
使用引數的格式化表示列印到 stdout 或檔案流
(函式模板) [編輯]
(C++23)
std::print 相同,但每次列印都以額外的換行符終止
(函式模板) [編輯]
輸出引數的格式化表示
(函式模板) [編輯]