C++ Templates (2.5 类模板特化 Specializations of Class Templates)
2.5 类模板特化 Specializations of Class Templates
可以为特定的模板参数进行特例化。类似于重载函数模板,特化类模板可以优化特定类型的实现,或者修正类模板对特定类型实例化不正确的行为。然而,如果特化类模板需要特化所有的成员函数。尽管特化类模板的单一成员函数是可能的,但如果这么做了,便不再能够特化这整个类模板实例。
特化一个类模板,必须声明一个类,该类以template<>开始,指定特化的类型作为模板参数,并紧跟着该类的名称:
template<>
class Stack<std::string>
{
...
};
针对这些特化,任何成员函数的定义必须定义为普通成员函数,每个T出现的地方需要有特化的类型代替:
void Stack<std::string>::push (std::string const& elem)
{
elems.push_bask(elem);
}
``
以下是**Stack<>**的**std::string**特化版本的完整例子
```cpp
// basics/stack2.hpp
#include "stack1.hpp"
#include <deque>
#include <string>
#include <cassert>
template<>
class Stack<std::string>
{
private:
std::deque<std::string> elems; //elements
public:
void push(std::string const&); // push element
void pop(); // pop element
std::string const& top() const;
bool empty() const
{
return elems.empty();
}
};
void Stack<std::string>::push (std::string const& elem)
{
elems.push_back(elem); // append copy of passed elem
}
void Stack<std::string>::pop ()
{
assert(!elems.empty());
elems.op_back();
}
std::string const& Stack<std::string>::top () const
{
assert(!elems.empty());
return elems.back(); // return copy of last element
}
该例子中,特化版本的push()
函数使用引用语义进行string参数的传递,对于该特定类型将更有意义(尽管传递转发引用forwarding reference会更好)。
另一个不同是stack内部使用deque而不是vector进行元素管理。尽管此处没有特殊的优势,但可以看出特化版本的实现可以和原模板的实现大相径庭。