Latest web development tutorials

plantilla C ++

Las plantillas son programación genérica, la programación genérico que es de manera independiente a ningún tipo particular de la escritura de código.

Plantilla para crear una clase o función proyecto o una fórmula genérica. contenedores biblioteca, iteradores, y algoritmos por ejemplo, son ejemplos de la programación genérica, todos ellos utilizan el concepto de plantillas.

Cada contenedor tiene una definición única, tales comovectores, podemos definir un número de diferentes tipos de vectores, como vector <int>ovector <string>.

Puede utilizar plantillas para definir las funciones y clases, vamos a echar un vistazo a cómo utilizar.

plantilla de función

La forma general de la función de plantilla se define como sigue:

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

Aquí, el tipo es una función de los tipos de datos utilizados nombres de marcador de posición. El nombre puede ser utilizado en la definición de función.

Aquí está un ejemplo de una plantilla de función devuelve el número máximo de dos tipos:

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

Cuando el código se compila y ejecuta, produce los siguientes resultados:

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

plantilla de clase

Como definimos plantillas de función, podemos definir las plantillas de clase. La forma general de una declaración de clase genérica es como sigue:

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

A continuación, se crea una instancia de tipo es un nombre de tipo de marcador de posición puede ser especificado en la clase.Se puede utilizar una lista separada por comas de definir múltiples tipos de datos genéricos.

El ejemplo siguiente define una clase Stack <>, y pone en práctica el enfoque genérico para apilar las operaciones en elementos pop:

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

Cuando el código se compila y ejecuta, produce los siguientes resultados:

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