Function template cho phép bạn tạo ta các hàm có khả năng thao tác với bất cứ đối tượng nào mà không cần overload. Với function template có được 1 tập hợp các hàm dựa trên một đoạn mã giống nhau nhưng lại tác động lên các đối tượng khác nhau. Bạn có thể dùng prototype của function template như một trong 2 cách sau:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
Hai prototype trên có thể coi là như nhau và được dùng như nhau. Ví dụ :
template <class T> void MySwap( T& a, T& b ){
T c( a );
a = b; b = c;
}
Đoạn mã này định nghĩa một tập hợp các hàm có khả năng hoán vị 2 tham số đưa vào. Từ template này bạn có thể tạo ra các hàm hoán chuyển không chỉ có kiểu int, long mà còn có thể hoán chuyển bất cứ kiểu nào, kể cả các kiểu do bạn tự định nghĩa.
Thêm vào đó funtion template sẽ ngăn cản bạn hoán chuyển các đối tượng (object)khác kiểu, bởi vì complier kiểm tra kiểu của các tham số ngay vào lúc biên dịch (complie time).
Bạn có thể gọi hàm funtion template như một hàm thông thường, không cần thêm bất kỳ cú pháp gì đặc biệt, ví dụ :
int i, j;
char k;
MySwap( i, j ); //OK
MySwap( i, k ); //Error, different types.
Kiểu của các tham số của function template cũng có thể được chỉ ra một cách rõ ràng như sau :
template<class T> void f(T) {...}
void g(char j) {
f<int>(j); //generate the specialization f(int)
}
Khi kiểu của các tham số được chỉ một cách rõ ràng, sự chuyển đổi kiểu sẽ được chuyển một cách tự động sao cho phù hợp, như ví dụ trên thì complier sẽ chuyển (char j) sang kiểu int.
Khi function template được gọi lần đầu tiên cho một kiểu cụ thể, complier tạo ra một instantiation (thể hiện), đây là một phiên bản (version) của template funtion cụ thể cho từng kiểu. "Thể hiện" này sẽ được gọi mỗi khi function được gọi tương ứng với kiểu đó. Nếu bạn có vài "thể hiện" giống nhau thì chỉ một "thể hiện" duy nhất được tạo ra.