C++成员模板,模板的模板参数以及模板的默认参数

#include <iostream>
#include <deque>
#include <memory>


template<typename T,
	template<typename ELEM, typename = std::allocator<ELEM> >
	class CONT = std::deque>
class Stack{
private:
	std::deque<T> elems;

public:
	void push(const T& elem);
	void pop();
	T top() const;
	inline bool empty() const { return this->elems.empty(); }

	template<typename T2,
		template<typename ELEM2, typename = std::allocator<ELEM2> >
		class CONT2 = std::deque>
	Stack<T, CONT>& operator=(const Stack<T2, CONT2>& op2);

};

template <typename T, template <typename, typename> class CONT>
void Stack<T, CONT>::push(T const& elem) {
	elems.push_back(elem);
}

template <typename T, template <typename, typename> class CONT>
	void Stack<T, CONT>::pop() {
	if (elems.empty()) {
		throw std::out_of_range("Stack<>::pop() : empty stack");
	}
	elems.pop_back();
}

template <typename T, template <typename, typename> class CONT>
T Stack<T, CONT>::top() const {
	if (elems.empty()) {
		throw std::out_of_range("Stack<>::top() : empty stack");
	}
	return elems.back();
}

template <typename T, template <typename, typename> class CONT>
template <typename T2, template <typename, typename> class CONT2>
Stack<T, CONT>& Stack<T, CONT>::operator=(const Stack<T2, CONT2>& op2) {
	if ((void*)this == (void*)&op2) {
		return *this;
	}

	Stack<T2, CONT2> tmp(op2);

	elems.clear();

	while (!tmp.empty()) {
		elems.push_back(tmp.top());
		tmp.pop();
	}

	return *this;
}


int main(void) {
	//模板的模板参数
	{
		try {
			Stack<int> intStack;
			Stack<float> floatStack;

			intStack.push(42);
			intStack.push(7);

			floatStack.push(7.7);

			floatStack = intStack;

			std::cout << floatStack.top() << std::endl;
			floatStack.pop();
			std::cout << floatStack.top() << std::endl;

		}
		catch (std::exception const& ex) {
			std::cerr << ex.what() << std::endl;
		}
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值