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
Với C++11 ta cũng biết khả năng nhận biết 1 kiểu dữ liệu với từ khóa auto, tuy nhiên với việc hiện thực 1 hàm thì thì C++11 chưa hỗ trợ khả năng nhận kiểu dữ liệu cho giá trị trả về trong hàm ngoại trừ biểu thức Lambda, trong C++14 đã hỗ trợ thêm tính năng này.

Giới thiệu

Trong C++14, từ khóa auto đã được cập nhật nhiều hơn về mặt tính năng, đó là khả năng nhận dạng kiểu dữ liệu được trả về từ trong một hàm, với C++11 chỉ hỗ trợ cho biểu thức Lambda.

Để trải nghiệm được C++14 bạn cần GCC 4.8+ hoặc trong bài viết này, tôi dùng Visual Studio 2015 Community.

Tiền đề bài viết

Sau khi nâng cấp lên Windows 10 và thử nghiệm Visual Studio 2015 Community, tôi đã thử 1 số tính năng mới của C++14 và chia sẻ lại 1 tính năng mới là tự động nhận dạng kiểu dữ liệu được trả về từ việc hiện thực 1 hàm.

Ngoài ra nó cũng là "đơn đặt hàng" từ tác giả Rye Nguyen muốn chia sẻ điều này cho các độc giả, tuy nhiên vì bận rộn với dự án xây dựng chương trình Unity miễn phí cho độc giả nên tôi thay mặc Rye chia sẻ bài viết này.

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

Dành cho các đối tượng muốn tiếp cận với C++14, tuy nhiên nên biết sơ lược về C++11 sẽ dễ tiếp cận hơn.

Nhắc lại auto trong C++11

C++11 - Từ Khóa auto có khả năng tự động nhận dạng được kiểu dữ liệu của khai báo biến hoặc kiểu trả về trong 1 lambda.

int sum(int a, int b)
{
	return a + b;
}

int main()
{
	// i kieu int vi 5 la kieu int
	auto i = 5;

	// c kieu char vi 'k' la kieu char
	auto c = 'k';	

	// s kieu const char* vi "www.stdio.vn" kieu const char*
	auto s = "www.stdio.vn";

	// r kieu int vi ham sum co kieu tra ve la int
	auto r = sum(1, 2);

	// max co kieu tra ve la int vi Lambda return la 1 kieu int
	// max se co dinh nghia day du la auto max = [](int a, int b)
	{
		return a > b ? a : b;
	};	

	// x la kieu int vi max co kieu tra ve la int
	auto x = max(1, 2);

	return 0;
}

Trong C++11, không có khả năng dự đoán được kiểu trả về của một hàm do đó, cú pháp sau sẽ không tồn tại.

auto sum(int a, int b)
{
	return a + b;
}

auto trong C++14

Với C++14, trình biên dịch hỗ trợ thêm tính năng nhận dạng kiểu dữ liệu được trả về từ hàm dựa vào kiểu dự liệu trong hàm trả về.

auto func(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}

int main()
{
	int t = func(1, 2);

	return 0;
}

Như hàm func trên, kiểu trả về của a (dòng 4) và b (dòng 6) đều là kiểu int nên trình biên dịch sẽ dự đoán được auto ở dòng 1 phải là kiểu int và biên dịch sẽ thành công.

Đánh đố trình biên dịch hơn như sau

auto func(int a, double b)
{
	if (a > b)
		return a;
	else
		return b;
}

Ở dòng 1 thì a là kiểu int còn b là kiểu double, do đó, việc return sẽ gây ra 2 trường hợp là int hay double (dòng 4 và 6) làm bối rối trình biên dịch không biết lựa chọn trường hợp nào. Trong trường hợp này, ta có thể đơn giản hóa là quay lại cách code thông thường đó là chỉ định kiểu trả về là kiểu gì hoặc kiểu trả về theo kiểu của Lambda hoặc nếu kiểu dữ liệu quá dài, để đỡ tốn thời gian có thể kết hợp thêm decltype (xem thêm C++11 - Từ Khóa decltype).

// Cach thong thuong
int func(int a, double b)
{
	if (a > b)
		return a;
	else
		return b;
}

// Cach nhu Lambda
auto func(int a, double b) -> int
{
	if (a > b)
		return a;
	else
		return b;
}

// Cach nhu Lambda ket hop decltype
auto func(int a, double b) -> decltype(a)
{
	if (a > b)
		return a;
	else
		return b;
}

Công nghệ hỗ trợ chúng ta phát triển sản phẩm nhanh, nhưng nó dành cho nhà phát triển, bạn đọc thuộc nhóm đang phát triển sản phẩm thì sử dụng công nghệ là đúng nhưng những bạn đọc đang trong quá trình học tập theo tôi nên học cách chế tạo ra bánh xe, không nên dùng bánh xe vào thời điểm này.

THẢO LUẬN