
Lập trình khái quát với hàm
(function templates)
1EE3490: Kỹ thuật lập trình – HK1 2011/2012
Đào Trung Kiên – ĐH Bách khoa Hà Nội

Khái niệm
Đôi khi ta muốn viết một lần nhưng có thể tạo ra các hàm
với tham số thuộc nhiều kiểu khác nhau, thay vì phải viết
chồng nhiều hàm tương tự nhau
int max(int a, int b) { return a>b ? b:a; }
double max(double a, double b) { return a>b ? b:a; }
float max(float a, float b) { return a>b ? b:a; }
lập trình ở mức độ khái quát cao hơn: coi kiểu của biến cũng là
tham số (type parameterization)
Khuôn mẫu hàm (function template): là khái niệm giúp
định nghĩa những hàm mà chưa xác định kiểu của các
tham số
Có thể hiểu là viết gộp chung các hàm chồng giống nhau về mặt
thuật toán
Kiểu của các tham số là tham số của khuôn mẫu
2EE3490: Kỹ thuật lập trình – HK1 2011/2012
Đào Trung Kiên – ĐH Bách khoa Hà Nội

Định nghĩa hàm khái quát
Ví dụ 1:
template <class T>
void swap(T& a, T& b) {
Tc = a; a = b; b = c; }
T được giả định là kiểu của các tham số a, b và biến c
T sẽ được xác định khi gọi hàm
T là tham số của khuôn mẫu, trong khi a, b là tham số của hàm
Ví dụ 2:
template <class Containter, class Object>
void push(Containter& s, Object o) {...}
Có thể dùng từ khoá “typename” thay vì “class”
template <typename T>
void swap(T& a, T& b) {...}
3EE3490: Kỹ thuật lập trình – HK1 2011/2012
Đào Trung Kiên – ĐH Bách khoa Hà Nội

Gọi hàm khái quát
Gọi với kiểu tường minh:
max<int>(a, b);
max<double>(x, y);
swap<String&>(s1, s2);
swap<Worker*&>(p1, p2);
push<List&, Student>(l, st);
Gọi với kiểu ngầm định:
int a, b;
double x, y;
max(a, b); // max<int>(a, b);
max(x, y); // max<double>(x, y);
max(a, x); // lỗi
4EE3490: Kỹ thuật lập trình – HK1 2011/2012
Đào Trung Kiên – ĐH Bách khoa Hà Nội

Chồng hàm khái quát
Các khuôn mẫu hàm cũng có thể được định nghĩa
chồng
template <class T> T max(T a, T b) { ... }
template <class T> T max(T a, T b, T c) { ... }
template <class T> T max(T* arr, int n) { ... }
Gọi hàm chồng
max<int>(10, 20);
max('c', 'f');
max<double>(1.5, 2.1, 3.14);
max("1un34k", 6);
5EE3490: Kỹ thuật lập trình – HK1 2011/2012
Đào Trung Kiên – ĐH Bách khoa Hà Nội

