template.cppRUN

//模板函数,模板类的示例
#include <iostream>

template <typename T> //template <class T>也可
void Sort(T & first, T & second)
{
	if (first > second)
	{
		T temp = second;
		second = first;
		first = temp;
	}
}

template <typename T>
class Vector
{
public:
	Vector() { x = y = 0; }
	Vector(T x, T y) { this->x = x, this->y = y; }

	Vector operator+(const Vector & second);
private:
	T x, y;
};

template <typename T>
Vector<T> Vector<T>::operator+ (const Vector<T> & second)
{
	Vector<T> result(this->x + second.x, this->y + second.y);
	return result;
}

template <typename T, int N=10>
class TStack
{
private:
	T		buffer[N];
	int		top; //top-1为栈顶,top==0时,表示空;top==N时,满
public:
	TStack() { top = 0; }


	bool Empty()const
	{
		if (top <= 0)return true;
		return false;
	}

	bool Full()const
	{
		if (top >= N)return true;
		return false;
	}

	bool Push(const T& v)
	{
		if (top >= N)return false;//栈满,退出

		buffer[top] = v;
		top++;
		return true;
	}

	T Top()const	//调用前需要Empty()确认是否为空
	{
		return buffer[top - 1]
	}

	T& Top()	//调用前需要Empty()确认是否为空
	{
		return buffer[top - 1]
	}

	T Pop()		//调用前需要Empty()确认是否为空
	{
		T v = buffer[top - 1];
		top--;
		return v;
	}

	template <typename T2, int N2> friend std::ostream& operator<<(std::ostream& os, const TStack<T2, N2>& st);
};

template <typename T2, int N2> std::ostream& operator<<(std::ostream& os, const TStack<T2, N2>& st)
{
	for (auto i = st.top - 1; i >= 0; i--)
	{
		os << st.buffer[i];
		if (i == 0)os << "\n";
		else os << "\t";
	}

	return os;
}

int main()
{
	int arr[] = {2, 1};
	Sort<int>(arr[0], arr[1]);

	double arrD[] = { 2.2, 1.1 };
	Sort(arrD[0], arrD[1]);

	Vector<int> v1(1, 2), v2, v3;
	v3 = v1 + v2;

	Vector<double> vd1(1.1, 2.2), vd2, vd3;
	vd3 = vd1 + vd2;


	TStack<int, 5> st;
	st.Push(1);
	st.Push(2);
	st.Push(3);
	std::cout << st;

	TStack<double> st2;
	st2.Push(1.1);
	st2.Push(2.2);
	st2.Push(3.3);
	std::cout << st2;

	return 0;
}