Chapter 11: Lập trình khái quát<br />
(Generic programming)<br />
<br />
1<br />
<br />
EE3490: Kỹ thuật lập trình – HK1 2017/2018<br />
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội<br />
<br />
Khuôn mẫu hàm<br />
(Function templates)<br />
<br />
2<br />
<br />
EE3490: Kỹ thuật lập trình – HK1 2017/2018<br />
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội<br />
<br />
General<br />
Đôi khi ta muốn viết một lần nhưng có thể tạo ra các hàm<br />
với tham số thuộc nhiều kiểu khác nhau, thay vì phải viết<br />
chồng nhiều hàm tương tự nhau<br />
<br />
<br />
<br />
<br />
<br />
int max(int a, int b)<br />
{ return a>b ? a:b; }<br />
double max(double a, double b) { return a>b ? a:b; }<br />
float max(float a, float b)<br />
{ return a>b ? a:b; }<br />
<br />
lập trình ở mức độ khái quát cao hơn: coi kiểu của biến cũng là<br />
tham số (type parameterization)<br />
<br />
Khuôn mẫu hàm (function template): là khái niệm giúp<br />
định nghĩa những hàm mà chưa xác định kiểu của các<br />
tham số<br />
<br />
<br />
<br />
<br />
<br />
3<br />
<br />
Có thể hiểu là viết gộp chung các hàm chồng giống nhau về mặt<br />
thuật toán<br />
Kiểu của các tham số là tham số của khuôn mẫu<br />
EE3490: Kỹ thuật lập trình – HK1 2017/2018<br />
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội<br />
<br />
Định nghĩa hàm khái quát<br />
Ví dụ 1:<br />
<br />
<br />
<br />
<br />
<br />
template <br />
void swap(T& a, T& b) {<br />
T c = a; a = b; b = c; }<br />
<br />
<br />
<br />
T được giả định là kiểu của các tham số a, b và biến c<br />
T sẽ được xác định khi gọi hàm<br />
T là tham số của khuôn mẫu, trong khi a, b là tham số của hàm<br />
<br />
<br />
<br />
<br />
Ví dụ 2:<br />
<br />
<br />
<br />
<br />
<br />
template <br />
void push(Containter& s, Object o) {...}<br />
<br />
Có thể dùng từ khoá “class” thay vì “typename”<br />
<br />
<br />
<br />
<br />
<br />
4<br />
<br />
template <br />
void swap(T& a, T& b) {...}<br />
EE3490: Kỹ thuật lập trình – HK1 2017/2018<br />
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội<br />
<br />
Gọi hàm khái quát<br />
Gọi với kiểu tường minh:<br />
<br />
<br />
<br />
<br />
<br />
max(a, b);<br />
max(x, y);<br />
swap(s1, s2);<br />
swap(p1, p2);<br />
push(l, st);<br />
<br />
Gọi với kiểu ngầm định:<br />
<br />
<br />
<br />
<br />
<br />
5<br />
<br />
int a,<br />
double<br />
max(a,<br />
max(x,<br />
max(a,<br />
<br />
b;<br />
x, y;<br />
b); // max(a, b);<br />
y); // max(x, y);<br />
x); // lỗi<br />
EE3490: Kỹ thuật lập trình – HK1 2017/2018<br />
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội<br />
<br />