C++:模板与泛型

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;
}
发布了46 篇原创文章 · 获赞 19 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_40520596/article/details/102941510