1. Vấn đề nó giải quyết
Formatting library tách message template khỏi giá trị, hỗ trợ runtime format argument store và cho user type định nghĩa quy tắc format. Nó làm một giả định quan trọng trở nên rõ và có thể kiểm tra.
2. Kiến thức cần có
Chuỗi, variadic argument và stream output.
Bạn cần biết biên dịch chương trình ngắn và đọc output.
3. Ý tưởng cốt lõi
Format string là khuôn, argument điền vào ô; vformat nhận pack đã type-erase, còn formatter dạy khuôn cách xử lý custom type. Hãy đọc std::format như lời hứa chính xác; runtime precondition vẫn do lập trình viên chịu trách nhiệm.
4. Cú pháp tối thiểu
std::string text = std::format("value = {}", value);5. Cách nó hoạt động
Chương trình đưa vào dạng nhỏ nhất cần thiết của
std::format.Nó áp dụng tính năng lên dữ liệu cố định và giữ owner cần thiết trong scope.
Nó in một kết quả để đối chiếu trực tiếp với source.
6. Lỗi thường gặp
Format string và argument phải khớp; parser của custom formatter phải tuân protocol. Hỗ trợ standard library có thể chậm hơn C++20 language mode.
Hãy kiểm tra cả header, mức hỗ trợ thư viện C++20, lifetime và kiểu được suy luận.
7. Khi nào nên dùng
Nên dùng khi cần ghép văn bản có cấu trúc dễ đọc mà không dùng chuỗi stream dài.
Tránh dùng khi standard library triển khai chưa có
<format>hoặc stream đơn giản đã đủ.
8. Ví dụ đơn giản
Source có guard và thực thi format, vformat cùng custom formatter; GCC 13.3/libstdc++ hiện tại chạy đầy đủ nhánh formatting. Tệp .cpp không nhận input nên kết quả dễ lặp lại.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp20/34_format_vformat_custom_formatter/main.cpp
// Day 34: format, vformat, and Custom Formatters
#include <iostream>
#include <string>
#if __has_include(<format>)
#include <format>
#define HAS_STD_FORMAT 1
#else
#define HAS_STD_FORMAT 0
#endif
struct Temperature {
int value{};
};
#if HAS_STD_FORMAT
template<>
struct std::formatter<Temperature> : std::formatter<int> {
auto format(const Temperature& temperature, format_context& context) const {
return std::formatter<int>::format(temperature.value, context);
}
};
#endif
int main() {
#if HAS_STD_FORMAT
Temperature temperature{23};
std::cout << std::format("direct = {} C\n", temperature);
auto arguments = std::make_format_args(temperature);
std::cout << std::vformat("vformat = {} C\n", arguments);
#else
std::cout << "<format> is unavailable in this libstdc++ build\n";
#endif
}
9. Điều cần nhớ
std::formatdiễn đạt ý tưởng C++20 trung tâm của ngày này.Ví dụ cô lập một hành vi bằng dữ liệu cố định.
Compiler check không thay thế suy luận về lifetime và runtime.
Ưu tiên interface nhỏ nhất nói đúng yêu cầu thật.
10. Câu hỏi tự kiểm tra
Dễ — Nhiệm vụ chính của
std::formattrong ví dụ tối thiểu là gì?Trung bình — Khác biệt chức năng giữa truyền argument trực tiếp cho
formatvà truyền argument store chovformatlà gì?Khó — Vì sao compiler hỗ trợ
-std=c++20nhưng standard library đi kèm vẫn có thể thiếu implementation<format>hoàn chỉnh?