Search…

C++11 - Từ Khóa decltype

15/09/20202 min read
Tìm hiểu về từ khoá decltype trong C++11.

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 mn đề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 autodecltype 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ề).

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024