Template trong C++



Template là nền tảng của lập trình tổng quát (generic programming), tức là viết code theo các mà độc lập với bất kỳ kiểu cụ thể nào.

Một Template là một blueprint hoặc là phương thức để tạo một lớp hoặc một hàm tổng quát. Các Library Container như Iterator và các thuật toán là các ví dụ của lập trình tổng quát và đã được phát triển bởi sử dụng khái niệm Template.

Mỗi container có một định nghĩa đơn, ví dụ vector, nhưng chúng ta có thể định nghĩa nhiều loạt vector khác nhau, ví dụ: vector <int> hoặc vector <string>.

Template là từ khóa trong C++, chúng ta có thể hiểu rằng là nó một kiểu dữ liệu trừu tượng, đặc trưng cho các kiểu dữ liệu cơ bản. Template là từ khóa báo cho trình biên dịch rằng đoạn mã sau đây định nghĩa cho nhiều kiểu dữ liệu và mã nguồn của nó sẽ được biên dịch sinh ra tương ứng cho từng kiểu dữ liệu trong quá trình biên dịch. Có hai kiểu Template trong C++:

  • Function Template: là một khuôn mẫu hàm, cho phép định nghĩa các hàm tổng quát thao tác cho nhiều kiểu dữ liệu.

  • Class template: là một khuôn mẫu lớp, cho phép định nghĩa các lớp tổng quát cho nhiều kiểu dữ liệu

Function Template trong C++

Dưới đây là cú pháp chung của một định nghĩa Function Template trong C++:

template <class kieu_du_lieu> kieu_tham_chieu ten_ham(danh sach tham so)
{
   // phan than ham
} 

Ở đây, kieu_du_lieu là một tên một kiểu dữ liệu được sử dụng bởi hàm. Tên này có thể được sử dụng bên trong định nghĩa hàm.

Sau đây là một ví dụ về Function Template trả về giá trị lớn nhất của hai giá trị:

#include <iostream>
#include <string>

using namespace std;

template <typename VietJack>
inline VietJack const& Max (VietJack const& a, VietJack const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{
 
    int i = 15;
    int j = 26;
    cout << "Gia tri lon nhat cua (i, j) la: " << Max(i, j) << endl; 

    double f1 = 4.5; 
    double f2 = 14.2; 
    cout << "Gia tri lon nhat cua (f1, f2) la: " << Max(f1, f2) << endl; 

    string s1 = "HocLapTrinhCplusplus"; 
    string s2 = "TaiVietJack"; 
    cout << "Gia tri lon nhat cua (s1, s2) la: " << Max(s1, s2) << endl; 

   return 0;
}

Tại dòng template <typename VietJack>, nếu bạn sử dụng class thay cho typename như trong cú pháp, thì chương trình vẫn chạy bình thường. Bởi vì với class và typename đã được định nghĩa trong C++. Còn với các tên khác, như tenKieuCuaToi, thì nó sẽ không chạy!!

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Function Template trong C++

Class Template trong C++

Giống như khi chúng ta có thể định nghĩa Function Template, chúng ta cũng có thể định nghĩa Class Template trong C++. Cú pháp chung của định nghĩa Class Template trong C++ là:

template <class kieu_du_lieu> class ten_lop {
.
.
.
}

Ở đây, kieu_du_lieu là tên kiểu, mà sẽ được xác định khi một lớp được khai báo. Bạn có thể định nghĩa nhiều hơn một kiểu dữ liệu tổng quát (generic) bởi sử dụng một danh sách phân biệt nhau bởi dấu phảy.

Ví dụ sau định nghĩa lớp Stack và triển khai các phương thức tổng quát để push và pop các phần tử từ Stack đó. (Stack: ngăn xếp, push: thêm nút mới vào đỉnh stack, pop: thao tác lấy 1 phần tử từ đỉnh stack).

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>

using namespace std;

template <class VietJack>
class Stack { 
  private: 
    vector<VietJack> phantu;     // cac phan tu 

  public: 
    void push(VietJack const&);  // hoat dong push phan tu 
    void pop();               // hoat dong pop phan tu 
    VietJack top() const;            // tra ve phan tu tren cung 
    bool empty() const{       // tra ve true neu la trong.
        return phantu.empty(); 
    } 
}; 

template <class VietJack>
void Stack<VietJack>::push (VietJack const& elem) 
{ 
    // phu them ban sao cua phan tu da truyen 
    phantu.push_back(elem);    
} 

template <class VietJack>
void Stack<VietJack>::pop () 
{ 
    if (phantu.empty()) { 
        throw out_of_range("Stack<>::pop(): stack da trong!"); 
    }
	// xoa phan tu cuoi cung 
    phantu.pop_back();         
} 

template <class VietJack>
VietJack Stack<VietJack>::top () const 
{ 
    if (phantu.empty()) { 
        throw out_of_range("Stack<>::top(): stack da trong!"); 
    }
	// tra ve ban sao cua phan tu cuoi cung 
    return phantu.back();      
} 

int main() 
{ 
    try { 
        Stack<int>         stackSoNguyen;  // mot stack cua cac so nguyen
        Stack<string> stackChuoi;    // mot stack cua cac chuoi

        // thao tac tren stack cac so nguyen 
        stackSoNguyen.push(10); 
        cout << stackSoNguyen.top() <<endl; 

        // thao tac tren stack cua chuoi
        stackChuoi.push("VietJackXinChaoCacBan"); 
        cout << stackChuoi.top() << std::endl; 
        stackChuoi.pop(); 
        stackChuoi.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
} 

Trong chương trình trên, ngoại lệ out_of_range đã được định nghĩa sẵn trong C++. Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Class Template trong C++

Mọi người cho thể tham gia khóa học thứ 5 của vietjackteam vào cuối tháng 11/2017 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : Khóa học Java.Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Khóa học cũng đưa 200 câu hỏi phỏng vấn java trên https://www.javatpoint.com/corejava-interview-questions vào nội dung để giúp các bạn dễ dàng vượt qua kì phỏng vấn

Mọi người có thể xem demo nội dung khóa học tại địa chỉ Video demo khóa học Offline

Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Thông tin khóa học tại Khóa học Java Online trên Udemy

Loạt bài hướng dẫn học lập trình C++ cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.