Danh sách bài viết về C++11
decltype là gì?
Trong C++11, từ khóa decltype
dùng để yêu cầu lấy kiểu dữ liệu của 1 biến hoặc 1 biểu thức/giá trị. Xét các ví dụ sau
// STDIO_i có kiểu là int vì 14 có kiểu là int decltype(14) STDIO_i; // STDIO_d có kiểu là double vì 14+3.0 có kết quả là 17.0 có kiểu là double decltype(14 + 3.0) STDIO_d; // STDIO_li_i có kiểu là list<int>::iterator do li.begin() có kiểu là list<int>::iterator list<int> li; decltype(li.begin()) STDIO_li_i;
decltype và auto
Từ khóa auto
hỗ trợ việc không cần xác định kiểu, vì kiểu sẽ được xác định thông qua giá trị hay biến được gán. Còn decltype
có thể xem là 1 phương pháp thay thế cho auto
khá hiệu quả.
auto m = 100; decltype(100) n = 100;
Cả 2 trường hợp trên, biến m
và n
đều sẽ có kiểu là int
.
Hàm trả có kết quả trả về là auto
Phải chỉ định kiểu trả về của hàm dạng sau
auto getInscreaseAge(int age) -> decltype(age) { return age++; }
Như cách viết hàm trên, auto
sẽ không thể xác định được kiểu dữ liệu trả về, với cú pháp mới trong C++11 với giá trị trả về kiểu auto
, phải "chỉ định" kiểu trả về là gì bằng cách thêm -> return_type
như trường hợp trên, có kiểu trả về sẽ là int
(do age
kiểu int
).
Cách viết hàm trên chưa thể hiện được lợi ích của việc dùng auto
và decltype
trong trường hợp này vì thật ra có thể viết đơn giản như sau
int getInscreaseAge(int age) { return age++; } // hoặc auto getInscreaseAge(int age) -> int { return age++; }
Sử dụng nó kèm với template.
template <typename T1, typename T2> auto getAdd(T1 arg1, T2 arg2) -> decltype(arg1 + arg2) { return (arg1 + arg2); }
Lựa chọn sử dụng decltype
cho kiểu sẽ được trả về, vậy kết quả cuối cùng sẽ quy định kiểu được trả về là kiểu gì, tất cả sẽ do kiểu truyền vào quyết định kiểu trả về chứ không phải bắt buộc phải biết trước kiểu trả về là gì (được quyền lựa chọn linh động hơn kiểu trả về).