User Tools

Site Tools


cpp:class_templates_specialization

This is an old revision of the document!


Εξειδίκευση ενός template

Συχνά είναι απαραίτητο να προδιαγράψουμε διαφορετική λειτουργικότητα σε ένα template με βάση τον τύπο των δεδομένων που θα εισαχθεί τελικά στην κλάση. Για παράδειγμα, για την κλάση Box<T> πρέπει να εισάγουμε διαφορετική λειτουργικότητα εάν ο τύπος δεδομένων είναι δείκτης, διότι σε αυτή την περίπτωση δεν αρκεί η απλή αντιγραφεί του δείκτη, αλλά θα πρέπει να δεσμευθεί ο απαραίτητος χώρος στη μνήμη προκειμένου η κλάση να δημιουργήσει ένα αντίγραφο της υφιστάμενης πληροφορίας που περνιέται μέσω του δείκτη. Το παράδειγμα εξειδίκευσης της κλάσης Box<T> όταν περνιέται δείκτης δίνεται παρακάτω:

BoxTemplateSpecialization1.hpp
#include "Box.hpp"
template<typename T>
class Box<T*> {
  T *e;
public:
  Box();
  Box(T* e);
  Box(const Box<T*>& b);
  ~Box();
  T* get() const;
  void set(T* e);
  template <T*>
  friend std::ostream& operator<<(std::ostream& out, const Box<T*>& t);
  Box<T*>& operator=(Box<T*>& b);
};
 
template <typename T>
Box<T*>::Box() {
  this->e = nullptr;
}
 
template <typename T>
Box<T*>::Box(T* e) {
  this->e = new T;
  *(this->e) = *e;
}
 
template <typename T>
Box<T*>::Box(const Box<T*>& b) {
  this->e = new T;
  *(this->e) = *b.e;
}
 
template <typename T>
Box<T*>::~Box() {
  delete this->e;
}
 
template <typename T>
T* Box<T*>::get() const { 
  T *ce = new T;
  *ce = *e;
  return ce;
}
 
template <typename T>
void Box<T*>::set(T *e) { 
  if(this->e != nullptr)
    delete this->e;
  this->e = new T;
  *(this->e) = *e;
}
 
template <typename T>
std::ostream& operator<<(std::ostream& out, const Box<T*>& t) {
  T* ptr = t.get();
  out << *ptr;
  delete ptr;
  return out;
}
 
template <typename T>
Box<T*>& Box<T*>::operator=(Box<T*>& b){
  set(b.e);
  return *this;
}
cpp/class_templates_specialization.1557807309.txt.gz · Last modified: 2019/05/14 03:15 (external edit)