Từ C++11, C++ hỗ trợ User Defined Literals (UDL) - cho phép lập trình viên định nghĩa hậu tố riêng cho các giá trị literal, giúp mã nguồn dễ đọc hơn và hỗ trợ chuyển đổi đơn vị tại thời điểm biên dịch.
Literal tích hợp sẵn
31(Integer)3.5(Double)4.2F(Float)'p'(Character)31ULL(Unsigned Long Long)0xD0(Hexadecimal)"pq"(String)
Tại sao cần UDL?
Ví dụ: long double Weight = 3.5; không rõ đơn vị (kg, lb, g?). Với UDL:
weight = 5.6_kg; ratio = 5.6_kg / 2.1_lb; // Tự động chuyển đổi đơn vị tại compile-time
Cú pháp định nghĩa UDL
ReturnType operator"" _suffix(ParameterType value) {
// xử lý value, trả về kết quả
}
Ví dụ: Đơn vị bộ nhớ
#include <iostream>
#include <iomanip>
using namespace std;
unsigned long long operator"" _kb(unsigned long long x) { return x * 1024; }
unsigned long long operator"" _b(unsigned long long x) { return x; }
unsigned long long operator"" _mb(unsigned long long x) { return x * 1024 * 1024; }
int main() {
unsigned long long size = 24_kb;
cout << "Size: " << size << endl; // 24576
cout << "Few more MB: " << (size + 2_mb) << endl; // 2121728
cout << "Size Div: " << (10_kb / 2_kb) << endl; // 5
cout << "1KB = " << (8_b * 128_b) << endl; // 1024
return 0;
}
Kết quả
Size: 24576 Few more MB: 2121728 Size Div: 5 1KB = 1024
Lợi ích: Tăng khả năng đọc mã, chuyển đổi đơn vị tại compile-time, giảm chi phí runtime.