Pile générique à capacité dynamique

Petit exemple banal de pile générique sur la base d'un type T, dont la capacité est déterminée de manière dynamique (il n'y a pas de plafond a priori sur le nombre d'éléments qu'elle peut contenir).

Je vous invite à le raffiner (ajouter la sémantique de copie et la sémantique de mouvement, en particulier).

Si votre compilateur n'est pas conforme au standard C++ 11, remplacez nullptr par 0 tout simplement.

#ifndef PILE_H
#define PILE_H
//
// Pouvez-vous identifier des invariants?
//
#include "Incopiable.h"
class Vide {};
template <class T>
   class Pile
      : Incopiable
   {
   public:
      using value_type = T; // type interne et public
   private:
      struct Noeud
      {
         value_type val_;
         Noeud *pred_;
         Noeud(const value_type &val)
            : val_{val}, pred_{}
         {
         }
      };
      Noeud *tete_;
   public:
      Pile() noexcept
         : tete_{}
      {
      }
      bool empty() const noexcept
         { return !tete_; }
      bool full() const noexcept
         { return false; }
      void push(const value_type &val)
      {
         auto p = new Noeud(val);
         p->pred_ = tete_;
         tete_ = p;
      }
      void pop()
      {
         if(empty()) throw Vide{};
         auto p = tete_->pred_;
         delete tete_;
         tete_ = p;
      }
      value_type& top()
      {
         if(empty()) throw Vide{};
         return tete_->val_;
      }
      ~Pile() noexcept
         { while (!empty()) pop(); }
   };
#endif

Valid XHTML 1.0 Transitional

CSS Valide !