3.1.2 成员函数的实现
为了定义类模板的成员函数,你必须指定该成员函数是一个函数模板,而且你还需要使用这个类模板的完整类型限定符 。因此,类型Stack<T>的成员函数push()的实现如下:
template <typename T>
void Stack<T>::push (T const& elem)
{
elems.push_back (elem); //把传入实参elem的拷贝 //附加到末端
}
在上面的例子中,调用了对应vector的push_back()方法,它把传入元素附加到该vector的末端。
请注意:vector的pop_back()方法只是删除末尾的元素,并没有返回该元素;之所以如此是充分考虑了异常安全性,因为要实现“一个绝对异常安全并且返回被删除元素的pop()”是不可能的(Tom Cargill在[CargillExceptionSafety]中首次讨论了这个话题,Sutter在[SutterExceptional]的Item 10也提到这个问题)。然而,如果不考虑异常安全性,我们就可以实现一个返回被删除元素的pop()。事实上,只需要使用T声明一个局部变量,并保证该变量的类型就是vector元素的类型即可;具体如下:
template<typename T>
T Stack<T>::pop()
{
if (elems.empty() ) {
throw std::out_of_range(“Stack<>::pop(): empty Stack”);
}
T elem = elems.back(); //先保存末端元素的拷贝
elems.pop_back(); //删除末端元素
return elem; //返回上面保存的元素的拷贝
}
因为当vector为空的时候,它的back()方法(返回末端元素的值)和pop_back()方法(删除末端元素)会具有未加定义的行为,因此我们需要先检查该stack是否为空。如果为空,就抛出std::out_of_range异常。同样,在top()的实现中,我们也是用这种办法来判断对应stack是否为空;top()只是返回栈的顶端 元素,并不删除该元素:
template<typename T>
T Stack<T>::top() const
{
if (elems.empty()) {
throw std::out_of_range(“Stack::top(); empty Stack”);
}
return elems.back(); //返回末端元素的拷贝
}
显然,对于类模板的任何成员函数,你都可以把它实现为内联函数,将它定义于类声明里面。例如:
template <typename T>
class Stack {
...
void push (T const& elem) {
elems.push_back(elem); //把传入的elem实参附加到末端
}
...
};