ProgrammatieC++ ontwikkelaar

Wat zijn templates in C++? Welke soorten templates bestaan er? Welke moeilijkheden en fouten ontstaan er bij het ontwerpen en gebruiken van templates? Geef een voorbeeld van een template klasse en functie.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Templates zijn een mechanisme in C++ waarmee generieke klassen en functies kunnen worden gemaakt die met verschillende datatypes werken zonder code te dupliceren. Dit is de basis voor de implementatie van STL-containers, algoritmen en veel patronen van generiek programmeren.

Soorten templates:

  • Functietemplates: maken het mogelijk om één functie voor verschillende types te creëren.
  • Klasstemplates: maken het mogelijk om klassen te creëren die met verschillende types werken.
  • Templates met waardeparameters: kunnen worden geparametriseerd niet alleen met types, maar ook met constante waarden.

Voorbeeld van een klasse template:

template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };

Voorbeeld van een functietemplate:

template<class T> T add(const T& a, const T& b) { return a + b; }

Vraag met een valstrik.

Is het mogelijk om alleen één methode van een template klasse expliciet te specialiseren zonder de hele klasse te specialiseren? Zo ja, hoe wordt dit gedaan?

Antwoord:
Ja, dat kan. Het is niet nodig om de hele klasse te specialiseren; je kunt gewoon een specifieke methode specialiseren:

template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // Specialisatie van alleen de methode bar voor int // Implementatie }

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp.


Verhaal
In een project werd een template functie geschreven voor vergelijking:

template <typename T> bool cmp(const T& a, const T& b) { return a < b; }

Bij gebruik met types die geen operator < hebben, ontstond een compileerfout die moeilijk te traceren was, omdat de diagnose alleen werd gegeven bij het instantieren van de template, en niet op het moment van definitie.


Verhaal
Een ontwikkelaar probeerde in een template functie optelling te gebruiken voor een gebruikersklasse, vergeten de operator + te overloaden. Dit leidde tot compileerfouten bij de eerste oproep met deze klasse.


Verhaal
Bij het ontwikkelen van een container op basis van een template klasse werd er een methode gemaakt die niet afhankelijk was van het template type, maar buiten de klasse werd geplaatst zonder expliciete specialisatie:

template<> int MyContainer<int>::size() const { ... }

Dit leidde tot een koppelfout omdat de specialisatie was gedeclareerd, maar niet correct was geïmplementeerd voor alle types.