- 類模闆的模闆參數
1.函數模闆是不支援模闆參數的,而類模闆支援模闆參數。 2.差別: 不使用模闆參數: Stack<int, std::vector<int> > vStack; 使用模闆參數: Stack<int, std::vector> vStack; std::vector本身實模闆,而std::vector<int則是作為class存在。 3.注意模闆參數需要比對. template<class T> class TT = std::deque //錯誤,模闆參數不比對 template<class T, class Alloc = std:alloctor<T> > class TT = std::deque //OK.
MyStack.h
#ifndef MYSTACK_H__
#define MYSTACK_H__
#include<deque>
#include<stdexcept>
#include<memory>
namespace gdl {
template<class T,
template<typename ELEMT,
typename Alloc = std::allocator<ELEMT> >
class CONT = std::deque>
class MyStack {
public:
void push(T const &);
void pop();
T top() const;
bool empty() const {
return elements.empty();
}
template<class T2,
template<typename ELEMT2,
typename Alloc2=std::allocator<ELEMT2> >
class CONT2>
MyStack<T, CONT> &operator=(MyStack<T2, CONT2> const&);
private:
CONT<T> elements;
};
template<class T, template<typename, typename>class CONT>
void MyStack<T,CONT>::push(T const&val) {
elements.push_back(val);
}
template<typename T, template<typename,typename>class CONT>
void MyStack<T, CONT>::pop() {
if (elements.empty()) {
throw std::out_of_range("MyStack<>::pop(): empty stack.");
}
elements.pop_back();
}
template<class T, template<class,class>class CONT>
T MyStack<T, CONT>::top() const {
if (elements.empty()) {
throw std::out_of_range("MyStack<>::top(): empty stack.");
}
return elements.back(); //傳回末端元素.
}
template<typename T, template<typename,typename>class CONT>
template<typename T2, template<typename,typename>class CONT2>
MyStack<T, CONT>& MyStack<T, CONT>::operator= (MyStack<T2, CONT2> const & op2) {
//指派自身.
if ((void*)this == (void*)&op2) {
return *this;
}
//copy.
MyStack<T2, CONT2> tmp(op2);
//clear.
elements.clear();
while (!tmp.empty()) {
elements.push_back(tmp.top());
tmp.pop();
}
return *this;
}
}
#endif
main.cpp
#include<iostream>
#include"MyStack.h"
#include<cstdlib>
#include<string>
#include<vector>
#include"test.h"
using namespace std;
int main(int argc, char** argv)
{
//=============================================
try {
gdl::MyStack<int> intStack;
gdl::MyStack<float> floatStack;
//使用int棧.
intStack.push(20);
intStack.push(50);
intStack.push(500);
//使用float stack.
floatStack.push(50);
floatStack.push(200);
//不同類型的stack的互相指派.
floatStack.operator=(intStack);
//gdl::MyStack<float> floatStack2 = intStack;
while (!floatStack.empty()) {
std::cout << floatStack.top() << std::endl;;
floatStack.pop();
}
floatStack.top();
}
catch (std::exception const & e) {
std::cout << e.what() << std::endl;
}
return 0;
}
print: