Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++.
Chúng ta đã từng học cách để viết hàm trong C++. Và nó giúp chúng ta dễ viết, sửa đổi, bảo trì chương trình dễ dàng hơn. Tuy nhiên, trong một số trường hợp, hàm khá bị giới hạn do ngôn ngữ C++ yêu cầu chúng ta phải chỉ định kiểu của tất cả các tham số.
Lấy ví dụ, chúng ta muốn viết một hàm trả về giá trị lớn nhất của hai số:
int max(int x, int y)
{
return (x > y) ? x : y;
}
Hàm trên hoạt động tốt - đối với tham số kiểu integer. Sẽ thế nào nếu sau đó chúng ta dùng hàm này để thực hiện trên hai số kiểu double? Theo cách truyền thống, chúng ta sẽ định nghĩa thêm một hàm max khác như sau:
double max(double x, double y)
{
return (x > y) ? x : y;
}
Chúng ta thấy phần định nghĩa của hàm double max(double, double) hoàn toàn giống với hàm int max(int, int).
Đây là thời điểm để chúng ta sử dụng hàm khuôn mẫu (function templates).
Hàm khuôn mẫu (Function templates) là gì?
Như tên gọi của nó, hàm khuôn mẫu đơn giản là một cái khuôn dùng để đúc nên nhiều hàm có định nghĩa giống nhau. Và nó có thể được tái sử dụng nhiều lần nếu chúng ta muốn.
Khi chúng ta gọi đến hàm khuôn mẫu, compiler sẽ tạo ra một bản sao của hàm đó, và thay thế kiểu dữ liệu tương ứng của các tham số khuôn mẫu.
Để dễ hiểu hơn, chúng ta cùng tạo ra một hàm khuôn mẫu đơn giản.
Tạo một function template đơn giản
Chúng ta cùng nhìn lại hàm max phiên bản kiểu integer một lần nữa:
int max(int x, int y)
{
return (x > y) ? x : y;
}
Có 3 vị trí có kiểu dữ liệu được khai báo tường minh: tham số x, y và giá trị trả về của hàm.
Để tạo ra một hàm khuôn mẫu, chúng ta sẽ thay thế những kiểu dữ liệu tường minh bằng những nhãn dán giữ chổ cho phiên bản gốc.
T max(T x, T y)
{
return (x > y) ? x : y;
}
Bây giờ, thay cho kiểu dữ liệu int, mình sử dụng kiểu T. Các bạn có thể đặt tên bất kỳ, nhưng thông thường, chúng ta sử dụng T đại diện cho Type.
Khi biên dịch chương trình, compiler báo lỗi vì không hiểu T có nghĩa là gì.
Vậy, để làm cho chương trình hoạt động, chúng ta cần làm 2 thứ: khai báo phía trước hàm để báo cho compiler biết đây là hàm khuôn mẫu, đặt tên cho nhãn giữ chổ.
template <typename T> // this is the template parameter declaration
T max(T x, T y)
{
return (x > y) ? x : y;
}
Như thế này, chương trình sẽ biên dịch thành công.
Với những hàm sử dụng nhiều hơn một kiểu tham số, ví dụ 2 tham số có 2 kiểu dữ liệu khác nhau, chúng ta có thể sửa lại như sau:
template <typename T1, typename T2>
Sử dụng function template trong chương trình
Cách sử dụng hàm khuôn mẫu hoàn toàn giống hàm thông thường.
#include <iostream>
template <typename T>
const T& max(const T& x, const T& y)
{
return (x > y) ? x : y;
}
int main()
{
int i = max(3, 7); // returns 7
std::cout << i << std::endl;
double d = max(6.34, 18.523); // returns 18.523
std::cout << d << std::endl;
char ch = max('a', '6'); // returns 'a'
std::cout << ch << std::endl;
return 0;
}
Chương trình này sẽ cho ra kết quả:
7
18.523
a
=====================================================
Mình đã giới thiệu sơ qua cho các bạn khái niệm về function templates. Hi vọng qua bài này, các bạn sẽ cảm thấy dễ hiểu hơn khi tự mình tìm hiểu đến phần class templates.
Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.
Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn.