Chào các bạn.
Hôm nay tình cờ mình biết được CongDongCViet thông qua DDTH, rất vui được tham gia thảo luận cùng các bạn yêu thích C/C++.
Để ra mắt mình sẽ viết loạt bài về cách sử dụng template trong C++
.
Bài viết này mình sẽ chia ra nhiều phần, hôm nay mình xin được trình bày phần 1.
Phần 1: Funtion Templates
Giả sử như chúng ta muốn viết một hàm tính giá trị lớn nhất của 2 số, ta có thể định nghĩa một macro theo kiểu của C:
"
Code:
#define max(a, b) ((a) > (b) ? (a) : (b))
"hoặc:
Code:
int max(int a, int b){
return a > b ? a : b;
}
Nhưng ta muốn viết hàm max cho cả kiểu double, long, float thì sao? Ta sẽ viết các hàm overload tương tự như thế này ?
Code:
float max(float a, float b);
long max (long a, long b);
double max(double a, double b);
hay
Code:
long double max (long double a, long double b);
Kô có kiểu dữ liếu số nào lớn hơn long double đúng không các bạn? Nhưng thật không may, có vài trường hợp thất bại. Vì sao thì dành cho các bạn tìm hiểu nha
Trong C++, chúng ta có thể giải quyết vấn đề này nhanh chóng bằng cách dùng "parameterized type" hay còn gọi template. Ta có thể định nghĩa hàm template giải quyết vấn đề như sau:
Code:
template <class T> inline T max(T a, T b)
{
return a > b ? a : b;
}
"template <class T>" được dùng để khai báo một template. T là tham số template, một tham số kiểu. Khi đó ta có thể sử dụng template này như sau:
Code:
int a = 1;
int b = 2;
int iM = max(a,b);
Lúc này kiểu của T là "int" vì a, b là các số nguyên.
Code:
double x = 0.5 ;
double y = 1.5;
double dM = max(x,y)
Lúc này kiểu của T là "double" vì x, y là các số double.
Quá trinh sinh ra hàm thực sự đúng với kiểu dữ liệu truyền vào được gọi là "instantiation".
Chú ý: Ta nên dùng const T& thay cho T trong khai báo tham số template, sẽ thảo luận vấn đề này sau.
Template không những áp dụng cho các kiểu dữ liệu số mà có thể áp dụng cho các kiểu dữ liệu khác ví dụ:
Code:
class A {
public:
int operator>(const A&);
};
A a;
A b;
A c = max(a, b);
Template rất mạnh nhưng cũng khá phức tạp. Template là độc quyền của C++, không có template trong C hoặc Java. Tham vọng của Bjarne Stroustrup (cha đẻ của C++) là hiện thực template để hỗ trợ "generic programming" trong lập trình hướng đối tượng (OOP) hơn là tính hiệu quả của template so với các ngôn ngữ khác.
Tạm thời ta kết thúc phần 1 ở đây, hẹn các bạn ở phần 2: Tính năng mới của C ++ - member template, class template
Bài viết có gì sai sót mong các bạn bổ sung.
Duy Do