Search…

Function Objects Hay Functor Với C++

18/09/20202 min read
Giới thiệu, cách sử dụng và ứng dụng Function Objects hay còn được gọi là Functor trong C++. Function Objects cũng khá lạ với điều này, function objects được hiện thực để sử dụng như một hàm, và có thể dùng như một kiểu dữ liệu (vì bản chất là object trong lập trình hướng đối tượng).

Giới thiệu

Function objects được hiện thực để sử dụng như một hàm, và có thể dùng như một kiểu dữ liệu (vì bản chất là đối tượng).

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

Thông thạo lập trình hướng đối tượng với ngôn ngữ C++. Ngoài ra cần biết thêm kiến thức về con trỏ hàm để dễ tiếp cận bài viết này, đọc thêm Con Trỏ Hàm Trong C/C++.

Function Objects là gì?

Function Objects hay còn được biết là Functor, mục tiêu của chúng ta là có thể dùng tên class xem như lời gọi hàm. Tức là với Function Objects ta sẽ có 2 điều sau: dùng như 1 kiểu dữ liệu, hoặc có thể xem như tên hàm để gọi. Xem xét đoạn codes bên dưới để hiểu rõ hơn.

SAddition add_obj;
	
// Use as data type
add_obj.set(10);

// Use as function - 10+15
int result = add_obj(10, 15);

Như codes trên ta thấy, đối tượng add_obj có thể sử dụng như một đối tượng, hoặc có thể gọi hàm, vậy phần việc còn lại của chúng ta là, khi ta gọi như gọi hàm, thì chúng ta phải hiện thực hàm này ra sao?

operator()

Để có thể gọi được add_obj() ta đơn giản hiện thực lại operator() trong class SAddition.

class SAddition
{
public:
	int operator()(int a, int b)
	{
		return a + b;
	}
};

int main()
{
	SAddition add_obj;

	// Original way
	add_obj.operator()(10, 15);

	// Short way
	add_obj(10, 15);

	return 0;
}

Ta hiện thực lại operator() với 2 tham số vào là a và b. Khi tiến hành gọi hàm, ta có thể gọi theo cách truyền thống là đối tượng - chấm - phương thức (add_obj.operator()(10, 15). Hoặc, đạt tới điều cuối cùng mà ta đang thảo luận, gọi như một hàm add_obj(10, 15) là 2 cách gọi tương đương nhau.

Lợi ích

Lợi ích của việc sử dụng Functor thay vì các hàm khác là hiện thực các hàm và các hàm này có thể lưu trạng thái (trong các thuộc tính của lớp), ta có thể truyền đối tượng vào một hàm khác bao gồm cả các thuộc tính cần thiết thông qua đối tượng và đặc tính này con trỏ hàm không có.

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