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进行元素管理。尽管此处没有特殊的优势,但可以看出特化版本的实现可以和原模板的实现大相径庭。

posted @ 2021-07-11 16:39  失落孤舟  阅读(58)  评论(0编辑  收藏  举报