格式化庫 (C++20 起)
來自 cppreference.com
文字格式化庫提供了一種安全且可擴充套件的替代方案,以取代 printf 系列函式。它旨在補充現有的 C++ I/O 流庫。
目錄 |
[編輯] 格式規範
格式規範指定了物件如何以不同型別的選項進行格式化。
基本型別和標準字串型別的物件格式化使用基本格式規範。其他庫元件也可能提供自己的格式規範,詳見此處。
[編輯] 格式化函式
定義於標頭檔案
<format> | |
(C++20) |
將引數的格式化表示儲存在新字串中 (函式模板) |
(C++20) |
透過輸出迭代器寫出其引數的格式化表示 (函式模板) |
(C++20) |
透過輸出迭代器寫出其引數的格式化表示,不超過指定大小 (函式模板) |
(C++20) |
確定儲存其引數格式化表示所需的字元數 (函式模板) |
[編輯] 格式字串
定義於標頭檔案
<format> | |
(C++20)(C++20)(C++20) |
在構造時執行編譯時格式字串檢查的類模板 (類模板) |
(C++26) |
建立可直接用於面向使用者的格式化函式的執行時格式字串 (函式) |
[編輯] 格式化概念
定義於標頭檔案
<format> | |
(C++23) |
指定一個型別是可格式化的,即它專門化了 std::formatter 並提供了成員函式 parse 和 format (概念) |
[編輯] 可擴充套件性支援和實現細節
定義於標頭檔案
<format> | |
(C++20) |
使用型別擦除引數表示的 std::format 的非模板變體 (函式) |
(C++20) |
使用型別擦除引數表示的 std::format_to 的非模板變體 (函式模板) |
(C++20)(C++20) |
建立引用所有格式化引數的型別擦除物件,可轉換為 format_args (函式模板) |
(C++20) (在 C++26 中廢棄) |
使用者定義格式化器的引數訪問介面 (函式模板) |
(C++20) |
定義給定型別的格式化規則 (類模板) |
(C++23) |
有助於實現範圍型別的 std::formatter 特化的類模板 (類模板) |
指示引數型別可以高效列印 (變數模板) | |
(C++23) |
指定範圍應如何格式化 (列舉) |
(C++23) |
為範圍選擇合適的 std::range_format (變數模板) |
(C++20) |
為使用者定義格式化器提供格式化引數訪問的類模板 (類模板) |
(C++20)(C++20)(C++20) |
提供對所有格式化引數訪問的類 (類模板) |
(C++20)(C++20)(C++20) |
格式化狀態,包括所有格式化引數和輸出迭代器 (類模板) |
(C++20)(C++20)(C++20) |
格式化字串解析器狀態 (類模板) |
(C++20) |
格式化錯誤時丟擲的異常型別 (類) |
[編輯] 輔助項 (C++23 起)
template< class R, class CharT > concept /*const-formattable-range*/ = |
(1) | (僅作說明*) |
template< class R, class CharT > using /*fmt-maybe-const*/ = |
(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::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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
P2418R2 | C++20 | 既不可 const-formattable 也不可複製的物件 (例如生成器類物件) 不可格式化 |
允許格式化這些物件 (放寬格式化器要求) |
P2508R1 | C++20 | 該功能沒有使用者可見的名稱 | 公開了名稱 basic_format_string |
[編輯] 另請參見
(C++23) |
使用引數的格式化表示列印到 stdout 或檔案流 (函式模板) |
(C++23) |
與 std::print 相同,但每次列印都以額外的換行符終止 (函式模板) |
(C++23) |
輸出引數的格式化表示 (函式模板) |