C++ Primer 学习笔记_84_模板与泛型编程 --模板特化(二)

2014-11-24 13:20:15 · 作者: · 浏览: 55
t { return real_queue.front(); } private: Queue real_queue; };

这个实现了Queue一个数据元素:string对象的Queue。各个成员将它们的工作委派给这个成员

Queue类的这个版本没有定义复制控制成员,它唯一的数据成员为类类型,该类类型在被复制、被赋值或被撤销时完成正确的工作。可以使用合成的复制控制成员

这个Queue类实现了与Queue的模板版本大部分相同但不完全相同的接口,区别在于front成员返回的是string而不是char*,这样做是为了避免必须管理字符数组――如果想要返回指针,就需要字符数组。

值得注意的是:特化可以定义与模板本身完全不同的成员。如果一个特化无法从模板定义某个成员,该特化类型的对象就不能使用该成员类模板成员的定义不会用于创建显式特化成员的定义。

【最佳实践】

类模板特化应该与它所特化的模板定义相同的接口,否则当用户试图使用未定义的成员时会感到奇怪。


2类特化定义

在类特化外部定义成员时,成员之前不能加template<>标记。

void Queue
  
   ::push(const char *p)
{
    return real_queue.push(p);
}

  

虽然这个函数几乎没有做什么工作,但它隐式复制了val指向的字符数组。复制是在对real_queue.push的调用中进行的,该调用从constchar* 实参创建了一个新的string对象。constchar * 实参使用了以constchar * 为参数的string构造函数,string构造函数将val所指的数组中的字符复制到未命名的string对象,该对象将被存储在push到 real_queue的元素中。