C++:模板与泛型
Q1: 在编译代码时,若出现这样一个情形:实现的功能一样,但处理的数据类型(例如:int、string、class)不一样;你会怎么解决?
Ans: 最开始的想法则是复制粘贴重写一遍,仅仅改变数据类型,其余一样,但解决后发现代码冗余严重,这时模板与泛型展现其优势。
#include <iostream>
using namespace std;
template<typename T,int SZ=16> //预先声明
class MStack {
public:
MStack();
~MStack();
bool push(T ele);
bool pop(T& ele);
void print(ostream& os)const;
int Capacity()const {
return m_nSize - m_nTop - 1;
}
private:
T* m_pData;
int m_nSize;
int m_nTop = -1;
};
template<typename T,int SZ> //预先声明
MStack<T, SZ>::MStack() {
m_nSize = SZ;
m_pData = new T[m_nSize];
memset(m_pData, 0, m_nSize * sizeof(T));
};
template<typename T, int SZ> //预先声明
MStack<T, SZ>::~MStack() {
delete[] m_pData;
};
template<typename T, int SZ> //预先声明
bool MStack<T, SZ>::push(T ele) {
if (m_nTop + 1 == m_nSize) return false;
m_pData[++m_nTop] = ele;
return true;
};
template<typename T, int SZ> //预先声明
bool MStack<T, SZ>::pop(T& ele) {
if (m_nTop == -1) return false;
ele = m_pData[m_nTop--];
return true;
};
template<typename T, int SZ> //预先声明
void MStack<T, SZ>::print(ostream& os)const {
for (int i = 0; i <= m_nTop; i++) {
os << m_pData[i] << endl;
};
};
int main()
{
MStack<int, 8> ms1;
MStack<float, 32> ms2;
ms1.push(10);
ms1.push(20);
ms2.push(3.5f);
ms2.push(100.0f);
//cout << ms2[1] << endl;
float fEle;
ms2.pop(fEle);
cout << fEle << endl;
cout << ms1.Capacity() << endl;
ms1.print(cout);
ms2.print(cout);
cout << ms2.Capacity() << endl;
return 0;
}