
/**//*************************************************
* 类模板成员特化
*
* 再提醒一下,虽然模板的特化和类的派生之间没有任何关
* 系, 但在特化模板的时候,不妨借鉴一下派生的精神.也就意味
* 着一个完全特化或局部特化通常必须重新实现 主模板具备的
* 所有能力.
*************************************************/
//例1
//主模板
template <typename T>
class Heap
...{
private:
std::vector<T> h_;
public:
void push(const T& val);
T pop();
bool empty() const //const声明在末尾表示该函数不能修改类变量
...{
return h_.empty();
}
}
//其实我们真正需要特化的是 push 和 pop两个函数.
//对比显式特化,它是通过主模板,再写一个模板显式特化版本类;
//而这里只是对类模板成员进行了单独特化.
template<>
void Heap<const char*>::push(const char *const &pval)
...{
h_.push_back(pval);
std::push_heap(h_.begin(),h_.end(),strLess);
}
template<>
const char* Heap<const char*>::pop()
...{
std:pop_heap(h_.begin(),h_end(),strLess);
const char* tmp = h_.back();
h_.pop_back();
return tmp;
}

/**//*************************************************
* 注意,这些函数的接口必须和 "它们正在特化其成员" 的模
* 板的相应接口相匹配.如例1, 就得和主模板的接口相匹配.而如
* 果你是自己再定义的一个显式/局部特化版本类,就不需要匹配
* 一致.(见显式特化和局部特化)
* 最后指出两点: 首先,除了成员函数外,其实成员也可以被
* 显式特化,如静态成员和成员模板.
* 其次,显式特化是为模板或模板成员提供定制版本的一种
* 手段;而显式实例化仅仅是明确地告诉编译器去实例化一个成
* 员.
*************************************************/
本文探讨了类模板成员特化的概念及应用,强调特化时需重新实现主模板的所有功能,并通过具体示例展示了如何对特定类型的成员函数进行特化。
1601

被折叠的 条评论
为什么被折叠?



