Latest web development tutorials

Szablon C ++

Szablony są programowania generycznego, programowanie rodzajowe, że jest samodzielny sposób do żadnego konkretnego rodzaju pisania kodu.

Szablon do tworzenia rodzajowego klasy lub funkcji plan lub formuły. Pojemniki biblioteka, iteratory oraz algorytmy, na przykład, są przykładami programowania generycznego, wszyscy używają pojęcia szablonów.

Każdy pojemnik ma jeden definicji takichwektorów można zdefiniować pewną liczbę różnych typów wektorów, takich jak wektor <Int>lubwektora ciągu <>.

Można używać szablonów do zdefiniowania funkcji i klas, rzućmy okiem na jak używać.

funkcja szablonu

Ogólna postać funkcji szablonie definiuje się w następujący sposób:

template <class type> ret-type func-name(parameter list)
{
   // 函数的主体
}  

Tutaj wpisz zależy od typów danych używanych nazw zastępczych. Nazwa może być użyty w definicji funkcji.

Oto przykład szablonu zwraca maksymalna liczba dwojakiego rodzaju:

#include <iostream>
#include <string>

using namespace std;

template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{
 
    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 

    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 

    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 

   return 0;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

szablon Class

Jak definiować szablony funkcyjne, możemy definiować szablony klas. Ogólna postać ogólnej deklaracji klasy przedstawia się następująco:

template <class type> class class-name {
.
.
.
}

Tutaj wpisz to nazwa typu zastępczy może być określony w klasie jest tworzony.Można użyć listę oddzielonych przecinkami zdefiniować wiele ogólnych typów danych.

Poniższy przykład definiuje klasę Stos <> i realizuje ogólne podejście do stosu pop operacji na elementach:

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

using namespace std;

template <class T>
class Stack { 
  private: 
    vector<T> elems;     // 元素 

  public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 

template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 

template <class T>
void Stack<T>::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::pop(): empty stack"); 
    }
	// 删除最后一个元素
    elems.pop_back();         
} 

template <class T>
T Stack<T>::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::top(): empty stack"); 
    }
	// 返回最后一个元素的副本 
    return elems.back();      
} 

int main() 
{ 
    try { 
        Stack<int>         intStack;  // int 类型的栈 
        Stack<string> stringStack;    // string 类型的栈 

        // 操作 int 类型的栈 
        intStack.push(7); 
        cout << intStack.top() <<endl; 

        // 操作 string 类型的栈 
        stringStack.push("hello"); 
        cout << stringStack.top() << std::endl; 
        stringStack.pop(); 
        stringStack.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
}  

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

7
hello
Exception: Stack<>::pop(): empty stack