Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
La Kiến Vinh Giới thiệu và hướng dẫn cách sử dụng từ khóa từ khóa decltype trong C++11, từ khóa này dùng để yêu cầu lấy kiểu dữ liệu của một biến hoặc một biểu thức/giá trị. Cách thức sử dụng decltype không khó, vấn đề là tính ứng dụng mà ta cần tìm hiểu để đưa vào chương trình.

Giới thiệu

Mỗi một biến hay một giá trị đều chứa thông tin về kiểu dữ liệu của nó và decltype trong C++11 giúp ta "lấy kiểu" và sử dụng kiểu của một biến hay giá trị đó.

Tiền đề bài viết

Sau khi thực hiện xong bài viết về C++11 - Từ Khóa auto nhận thấy decltype là một từ khóa có mối quan hệ với auto, nên tôi thực hiện thêm bài viết này.

Đối tượng hướng đến

C++11 hỗ trợ thêm nhiều tính năng mới cho việc phát triển ứng dụng thuận tiện hơn, bài viết này thuộc thể loại mang tính giới thiệu tính năng, nên nó phù hợp với các nhà phát triển có sử dụng C++ trong dự án của mình.

Các bạn đã đọc qua bài viết C++11 - Từ Khóa auto hoặc đã biết về auto 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 một biến hoặc một 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à một 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

Ta 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, bạn 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, ta 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 ta có thể viết đơn giản như sau

int getInscreaseAge(int age)
{
	return age++;
}

// hoặc

auto getInscreaseAge(int age) -> int
{
	return age++;
}

Ta sẽ 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 ta 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ề).

THẢO LUẬN
ĐÓNG