| Liên Mạng VietNam || GiaiTri.com | GiaiTriLove.com | GiaiTriChat.com | LoiNhac.com | Đăng Nhập | Gia Nhập |
Home >> Khoa Học >> Giáo trình C++ | Templates (mẫu) là một tính năng mới được giới thiệu bởi chuẩn ANSI-C++. Nếu bạn sử dụng một trình biên dịch C++ chưa tương thích với chuẩn này thì bạn không thể sử dụng mẫu. |
sự khác biệt duy nhất giữa hai kiểu khai báo mẫu này là việc sử dụng từ khoá class hay typename, sự khác nhau giữa chúng là không rõ ràng vì cả hai đều có cùng một ý nghĩa và đều cho một kết quả như nhau.
template <class indetifier> function_declaration;
template <typename indetifier> function_declaration;
Ở dòng đầu tiên, chúng ta đã tạo một mẫu cho một kiểu dữ liệu tổng quát với tên GenericType. Vì vậy trong hàm sau đó, GenericType trở thành một kiểu dữ liệu hợp lệ và nó được sử dụng như là một kiểu dữ liệu cho hai tham số a, b và giá trị trả về của hàm GetMax.template <class GenericType>
GenericType GetMax (GenericType a, GenericType b) {
return (a>b?a:b);
}
Ví dụ, để gọi hàm GetMax và so sánh hai giá trị nguyên kiểu int chúng ta có thể viết:
function <pattern> (parameters);
int x,y;
GetMax <int> (x,y);
#include <iostream.h> template <class T> T GetMax (T a, T b) { T result; result = (a>b)? a : b; return (result); } int main () { int i=5, j=6, k; long l=10, m=5, n; k=GetMax<int>(i,j); n=GetMax<long>(l,m); cout << k << endl; cout << n << endl; return 0; } | 6 10 |
T result;
Cách này được sử dụng phổ biến hơn và cũng cho kết quả như vậy:
int i,j;
GetMax (i,j);
#include <iostream.h> template <class T> T GetMax (T a, T b) { return (a>b?a:b); } int main () { int i=5, j=6, k; long l=10, m=5, n; k=GetMax(i,j); n=GetMax(l,m); cout << z << endl; cout << n << endl; return 0; } | 6 10 |
int i;
long l;
k = GetMax (i,l);
Trong trường hợp này, hàm mẫu GetMin() chấp nhận hai tham số có kiểu khác nhau và trả về một đối tượng có cùng kiểu với tham số đầu tiên (T). Ví dụ, sau khi khai báo như trên chúng ta có thể gọi hàm như sau:template <class T, class U>
T GetMin (T a, U b) {
return (a<b?a:b);
}
hoặc thậm chí:int i,j;
long l;
i = GetMin<int,long> (j,l);
i = GetMin (j,l);
Lớp mà chúng ta vừa định nghĩa dùng để lưu trữ hai phần tử có kiểu bất kì. Ví dụ, nếu chúng ta muốn khai báo một đối tượng thuộc lớp này để lưu trữ hai giá trị nguyên kiểu int có giá trị là 115 and 36 chúng ta có thể viết:template <class T>
class pair {
T values [2];
public:
pair (T first, T second)
{
values[0]=first; values[1]=second;
}
};
lớp này cũng có thể được dùng để lưu trữ bất kì kiểu dữ liệu nào khác:
pair<int> myobject (115, 36);
Hàm thành viên duy nhất được định nghĩa inline bên trong định nghĩa của lớp, tuy nhiên nếu chúng ta định nghĩa một hàm thành viên bên ngoài lớp chúng ta luôn phải đặt trước dòng định nghĩa tiền tố template <... >.
pair<float> myfloats (3.0, 2.18);
#include <iostream.h> template <class T> class pair { T value1, value2; public: pair (T first, T second) {value1=first; value2=second;} T getmax (); }; template <class T> T pair<T>::getmax () { T retval; retval = value1>value2? value1 : value2; return retval; } int main () { pair <int> myobject (100, 75); cout << myobject.getmax(); return 0; } | 100 |
Tất cả các T xuất hiện ở đó đều là cần thiết. Mỗi khi bạn khai báo một hàm thành viên bạn sẽ phải theo một khuôn mẫu tương tự như thế.
template <class T>
T pair<T>::getmax ()
#include <iostream.h> template <class T> class pair { T value1, value2; public: pair (T first, T second) {value1=first; value2=second;} T module () {return 0;} }; template <> class pair <int> { int value1, value2; public: pair (int first, int second) {value1=first; value2=second;} int module (); }; template <> int pair<int>::module() { return value1%value2; } int main () { pair <int> myints (100,75); pair <float> myfloats (100.0,75.0); cout << myints.module() << ; cout << myfloats.module() << ; return 0; } | 25 0 |
Sự chuyên môn hoá này là một phần của một mẫu, vì vậy chúng ta phải bắt đầu phần khai báo với template <>. Và rõ ràng rằng đó là sự chuyên môn hoá cho một kiểu dữ liệu cụ thể nên chúng ta không thể dùng một kiểu dữ liệu tổng quát, cặp ngoặc nhọn <> cũng phải để trống. Sau phần tên lớp chúng ta phải viết thêm tên kiểu dữ liệu muốn dùng ở giữa cặp ngoặc nhọn <>.
template <> class class_name <type>
#include <iostream.h> template <class T, int N> class array { T memblock [N]; public: setmember (int x, T value); T getmember (int x); }; template <class T, int N> array<T,N>::setmember (int x, T value) { memblock[x]=value; } template <class T, int N> T array<T,N>::getmember (int x) { return memblock[x]; } int main () { array <int,5> myints; array <float,5> myfloats; myints.setmember (0,100); myfloats.setmember (3.0,3.1416); cout << myints.getmember(0) << ; cout << myfloats.getmember(3) << ; return 0; } | 100 3.1416 |
template <class T> // Trường hợp phổ biến nhất: một tham số lớp.
template <class T, class U> // Hai tham số lớp.
template <class T, int N> // Một lớp và một giá trị nguyên.
template <class T = char> // Một tham số lớp với giá trị mặc định.
template <int Tfunc (int)> // Tham số là một hàm.