Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

Dominando Templates em C++: Guia para Programação Genérica

Templates são a base da programação genérica, que envolve escrever código de forma independente de qualquer tipo particular.

Um template é um blueprint ou fórmula para criar uma classe genérica ou uma função. Containers da biblioteca como iteradores e algoritmos são exemplos de programação genérica e foram desenvolvidos usando o conceito de template.

Existe uma única definição de cada container, como vector, mas podemos definir muitos tipos diferentes de vectors, por exemplo, vector<int> ou vector<string>.

Você pode usar templates para definir funções bem como classes, vamos ver como eles funcionam:

Template de Função

A forma geral de uma definição de função template é mostrada aqui:

template <class type> ret-type func-name(parameter list) {
    // corpo da função
}

Aqui, type é um nome placeholder para um tipo de dado usado pela função. Este nome pode ser usado dentro da definição da função.

O exemplo a seguir é de um template de função que retorna o máximo de dois valores:

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

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado:

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

Template de Classe

Assim como podemos definir function templates, também podemos definir class templates. A forma geral de uma declaração de classe genérica é mostrada aqui:

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

Aqui, type é o nome do tipo placeholder, que será especificado quando uma classe for instanciada. Você pode definir mais de um tipo de dado genérico usando uma lista separada por vírgulas.

O exemplo a seguir define a classe Stack<> e implementa métodos genéricos para push e pop de elementos da stack:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
using namespace std;
template <class T>
class Stack {
private:
    vector<T> elems; // elementos
public:
    void push(T const&); // push element
    void pop();          // pop element
    T top() const;       // return top element
    bool empty() const { // return true if empty
        return elems.empty();
    }
};
template <class T>
void Stack<T>::push(T const& elem) {
    // append copy of passed element
    elems.push_back(elem);
}
template <class T>
void Stack<T>::pop() {
    if(elems.empty()) {
        throw out_of_range("Stack<>::pop(): empty stack");
    }
    // remove last element
    elems.pop_back();
}
template <class T>
T Stack<T>::top() const {
    if(elems.empty()) {
        throw out_of_range("Stack<>::top(): empty stack");
    }
    // return copy of last element
    return elems.back();
}
int main() {
    try {
        Stack<int> intStack;      // stack de ints
        Stack<string> stringStack; // stack de strings
        // manipula int stack
        intStack.push(7);
        cout << intStack.top() << endl;
        // manipula string stack
        stringStack.push("hello");
        cout << stringStack.top() << std::endl;
        stringStack.pop();
        stringStack.pop();
    } catch(exception const& ex) {
        cerr << "Exception: " << ex.what() << endl;
        return -1;
    }
}

Se compilarmos e executarmos o código acima, isso produziria o seguinte resultado:

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

Linguagem C

  1. Entendendo Tipos de Dados em C++: Fundamentos, Modificadores e Boas Práticas
  2. Dominando Operadores em C++: Guia Completo com Exemplos Práticos
  3. Comentários em C++: Boas Práticas para Código Legível e Manutenível
  4. Entendendo Construtores em C++: Padrão, Parametrizados e de Cópia Explicados
  5. Linguagem de Programação C++: Visão Geral e Principais Características
  6. Constantes e Literais em C++: Tipos, Sintaxe e Boas Práticas
  7. Guia Completo de Operadores em C++: Tipos, Uso e Boas Práticas
  8. Dominando Tipos Numéricos em C++: Guia Prático
  9. Entendendo Referências em C++: Conceitos-Chave e Diferenças de Ponteiros
  10. Pré-processador C++: Como Diretivas Moldam Seu Código