//basic/stack3.hpp
#include <vector>
#include <stdexcept>
template<typename T ,typename CONT = std::vector<T> > // type a space between twp '>'
class Stack
{
private:
CONT elems; //contain the elems ,default is vector
static int static_ver; // this static variable will instantiation in each different types of template is called
public:
void push(T const&) ;
void pop(void);
T top(void) const ; //why not return T &
bool empty(void) const
{
return elems.empty();
}
Stack (Stack<T,CONT> const&); //use Stack<> when you need to specify the class type
//use only Stack when you only want to specify the class name
Stack<T,CONT>& operator= (Stack<T,CONT> const&) ;
};
template<typename T ,typename CONT>
void Stack<T,CONT>::push ( T const& elem ) //use Stack<>::
{
elems.push_back(elem);
}
template<typename T ,typename CONT>
void Stack<T,CONT>::pop(void) //why not specify throw
{
if(elems.empty())
{
throw std::out_of_range("Stack<>::pop(): empty stack");
}
elems.pop_back();
}
template<typename T ,typename CONT>
T Stack<T,CONT>::top(void) const
{
if (elems.empty())
{
throw std::out_of_range("Stack<>::top(): empty stack");
}
return elems.back();
}
#include <vector>
#include <stdexcept>
template<typename T ,typename CONT = std::vector<T> > // type a space between twp '>'
class Stack
{
private:
CONT elems; //contain the elems ,default is vector
static int static_ver; // this static variable will instantiation in each different types of template is called
public:
void push(T const&) ;
void pop(void);
T top(void) const ; //why not return T &
bool empty(void) const
{
return elems.empty();
}
Stack (Stack<T,CONT> const&); //use Stack<> when you need to specify the class type
//use only Stack when you only want to specify the class name
Stack<T,CONT>& operator= (Stack<T,CONT> const&) ;
};
template<typename T ,typename CONT>
void Stack<T,CONT>::push ( T const& elem ) //use Stack<>::
{
elems.push_back(elem);
}
template<typename T ,typename CONT>
void Stack<T,CONT>::pop(void) //why not specify throw
{
if(elems.empty())
{
throw std::out_of_range("Stack<>::pop(): empty stack");
}
elems.pop_back();
}
template<typename T ,typename CONT>
T Stack<T,CONT>::top(void) const
{
if (elems.empty())
{
throw std::out_of_range("Stack<>::top(): empty stack");
}
return elems.back();
}
//basics/stack3test.cpp
#include <iostream>
#include <deque>
#include <cstdlib>
#include "stack3.hpp"
int main(void)
{
try
{
Stack<int> intStack;
intStack.push(7) ; // only instantiation the function when it's called
// so you can use the 'type' that cannot perform all method in this template ,but only can perform the method you will use in your application.
std::cout<< intStack.top() <<std::endl;
intStack.pop();
intStack.pop();
std::cin.get();
}
catch (std::exception const& ex)
{
std::cerr<<"Exception: "<<ex.what()<<std::endl;
std::cin.get();
return EXIT_FAILURE;
}
}
#include <iostream>
#include <deque>
#include <cstdlib>
#include "stack3.hpp"
int main(void)
{
try
{
Stack<int> intStack;
intStack.push(7) ; // only instantiation the function when it's called
// so you can use the 'type' that cannot perform all method in this template ,but only can perform the method you will use in your application.
std::cout<< intStack.top() <<std::endl;
intStack.pop();
intStack.pop();
std::cin.get();
}
catch (std::exception const& ex)
{
std::cerr<<"Exception: "<<ex.what()<<std::endl;
std::cin.get();
return EXIT_FAILURE;
}
}