#include<iostream>
using namespace std;




template<typename T = int , size_t N = 100> class Stack {
private:	
 T _rep[N];
 size_t _top;
public:
  typedef T value_type;

  Stack():_top(0) {};

 void push(T val)          {_rep[_top++]=val;}
 T pop()                   {return _rep[--_top];}
 bool is_empty() const     {return (_top==0);} 
};

template<size_t N > class Stack<void *,N> {
private:	
 void * _rep[N];
 size_t _top;
public:
  typedef void * value_type;

  Stack():_top(0) {};

 void push(void * val)          {_rep[_top++]=val;}
 void * pop()                   {return _rep[--_top];}
 bool is_empty() const     {return (_top==0);} 
};



template<typename T,size_t N> 
class Stack<T*,N>: private Stack<void *,N> {
public:
   T* pop() {
     return static_cast<T*>(Stack<void *,N>::pop());
   };
 
   void push(T *e) {
     Stack<void *,N>::push(e);
   }

   bool is_empty() {return Stack<void *,N>::is_empty();} 
};


main() {
  Stack<int *,40> spi;

  spi.push(0);
  cerr<<spi.pop()<<endl;

  
}

