Latest web development tutorials

template C ++

I modelli sono programmazione generica, programmazione generica che è un modo autonomo a qualsiasi tipo particolare di scrivere codice.

Modello per creare una classe o una funzione generica modello o formula. contenitori Biblioteca, iteratori e algoritmi per esempio, sono esempi di programmazione generica, tutti usano il concetto di modelli.

Ogni contenitore ha una definizione, qualivettori, possiamo definire un certo numero di diversi tipi di vettori, come vector <int>ovector <string>.

È possibile utilizzare i modelli per definire le funzioni e le classi, diamo uno sguardo a come utilizzare.

modello di funzione

La forma generale della funzione modello è definito come segue:

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

Qui tipo è una funzione dei tipi di dati utilizzati nomi placeholder. Il nome può essere utilizzato nella definizione della funzione.

Ecco un esempio di un modello di funzione restituisce il numero massimo di due tipi:

#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;
}

Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:

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

modello di classe

Come definiamo i modelli di funzione, possiamo definire i modelli di classe. La forma generale di una dichiarazione di classe generica è la seguente:

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

Qui, il tipo è un nome di tipo segnaposto può essere specificato nella classe viene creata un'istanza.È possibile utilizzare un elenco separato da virgole di definire più tipi di dati generici.

L'esempio seguente definisce una classe Stack <>, e implementa l'approccio generico di impilare le operazioni di pop su elementi:

#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;
    } 
}  

Quando il codice di cui sopra è compilato ed eseguito, produce i seguenti risultati:

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