Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

C++ Templates Beheersen: Gids voor Generisch Programmeren

Templates zijn de basis van generisch programmeren: code schrijven die onafhankelijk is van een specifiek datatype.

Een template is een blauwprint of formule voor een generieke klasse of functie. STL-containers zoals vector en algoritmen zijn voorbeelden van generisch programmeren, gebouwd met templates.

Er is één definitie van elke container (bijv. vector), maar je kunt er veel varianten van maken: vector<int>, vector<string>, etc.

Functietemplates

De algemene vorm van een functietemplate:

template <class type>
ret-type func-naam(parameterlijst) {
    // functiebody
}

type is een placeholder voor het datatype dat de functie gebruikt.

Voorbeeld: Maximum van twee waarden

#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, j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl;

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

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

Uitvoer:

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

Klasstemplates

Net als functies kun je klassen als template definiëren:

template <class type>
class klasse-naam {
    // ...
}

type is de placeholder die wordt ingevuld bij instantiesering. Je kunt meerdere typenames scheiden met komma's.

Voorbeeld: Generieke Stack-klasse

#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(): lege stack");
    }
    elems.pop_back();
}

template <class T>
T Stack<T>::top() const {
    if (elems.empty()) {
        throw out_of_range("Stack<>::top(): lege stack");
    }
    return elems.back();
}

int main() {
    try {
        Stack<int> intStack;
        Stack<string> stringStack;

        intStack.push(7);
        cout << intStack.top() << endl;

        stringStack.push("hello");
        cout << stringStack.top() << endl;
        stringStack.pop();
        stringStack.pop(); // trigger exception
    } catch (exception const& ex) {
        cerr << "Exception: " << ex.what() << endl;
        return -1;
    }
}

Uitvoer:

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

C Taal

  1. C++ datatypes begrijpen: fundamentals, modifiers en best practices
  2. C++ operators: complete gids met praktische voorbeelden
  3. C++ comments: best practices voor leesbare, onderhoudbare code
  4. C++ constructors: default, parameterized en copy constructors uitgelegd
  5. C++ Class Templates Beheersen: Een Praktische Gids
  6. C++ Programmeertaal: Overzicht & Belangrijkste Kenmerken
  7. C++ Constanten & Literals Uitgelegd: Types, Syntax en Best Practices
  8. Uitgebreide Gids voor C++ Operators: Types, Gebruik en Best Practices
  9. Numerieke Typen in C++ Beheersen: Een Praktische Gids
  10. C++ Referenties Begrijpen: Sleutelconcepten & Verschillen met Pointers
  11. C++ Preprocessor: Hoe Directives Je Code Vormgeven