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++-sjablonen

Sjablonen vormen de basis van generieke programmering, waarbij code wordt geschreven op een manier die onafhankelijk is van een bepaald type.

Een sjabloon is een blauwdruk of formule voor het maken van een generieke klasse of functie. De bibliotheekcontainers zoals iterators en algoritmen zijn voorbeelden van generieke programmering en zijn ontwikkeld met behulp van een sjabloonconcept.

Er is een enkele definitie van elke container, zoals vector , maar we kunnen veel verschillende soorten vectoren definiëren, bijvoorbeeld vector of vector .

U kunt sjablonen gebruiken om zowel functies als klassen te definiëren, laten we eens kijken hoe ze werken −

Functiesjabloon

De algemene vorm van een sjabloonfunctiedefinitie wordt hier getoond −

template <class type> ret-type func-name(parameter list) {
   // body of function
} 

Type is hier een tijdelijke aanduiding voor een gegevenstype dat door de functie wordt gebruikt. Deze naam kan gebruikt worden binnen de functiedefinitie.

Het volgende is het voorbeeld van een functiesjabloon die het maximum van twee waarden retourneert −

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

Als we bovenstaande code compileren en uitvoeren, zou dit het volgende resultaat opleveren −

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

Klassjabloon

Net zoals we functiesjablonen kunnen definiëren, kunnen we ook klassensjablonen definiëren. De algemene vorm van een generieke klasseverklaring wordt hier getoond −

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

Hier, typ is de naam van het type tijdelijke aanduiding, die wordt opgegeven wanneer een klasse wordt geïnstantieerd. U kunt meer dan één generiek gegevenstype definiëren door een door komma's gescheiden lijst te gebruiken.

Hieronder volgt het voorbeeld om de klasse Stack<> te definiëren en generieke methoden te implementeren om de elementen van de stapel te pushen en eruit te halen −

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

using namespace std;

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

   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 of ints 
      Stack<string> stringStack;    // stack of strings 

      // manipulate int stack 
      intStack.push(7); 
      cout << intStack.top() <<endl; 

      // manipulate 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;
   } 
} 

Als we bovenstaande code compileren en uitvoeren, zou dit het volgende resultaat opleveren −

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

C Taal

  1. C++-gegevenstypen
  2. C++-operators
  3. C++ Opmerkingen
  4. C++-constructeurs
  5. C++-klassesjablonen
  6. C++-overzicht
  7. C++-constanten/letters
  8. Operatoren in C++
  9. Getallen in C++
  10. C++-referenties
  11. C++ Preprocessor