(1)类模板特例化
某些时候通用模板的定义不适用,这个时候就需要对特定类型的实例进行特例化.
例子1:hash类模板是标准库里的一个模板,我们现在需要对它进行特例化,定义hash<Sales_data>
,使得关联容器可以存储相应的对象.
#include "unordered_set"
#include "Sales.h"
namespace std{
template<>
struct hash<Sales_data>
{
typedef size_t result_type;
typedef Sales_data argument_type;
size_t operator() (const Sales_data&) const;
};
size_t hash<Sales_data>:: operator()(const Sales_data& s) const
{
return hash<string>()(s.bookNo) ^ hash<unsigned>()(s.units_sold)
^ hash<double>()(s.revenue);
}
}
int main(int argc, char** argv)
{
unordered_multiset<Sales_data> record;
Sales_data a("aaa", 10, 2), b("bbbb"), c("ccccc");
record.insert(a);
record.insert(b);
record.insert(c);
for (auto it : record)
print(cout, it)<<endl;
return 0;
}
(2)函数模板特例化:和类模板特例化相似,我有时候需要将函数模板特例化。下面通过一个例子来进行分析.
例子2:定义一个函数模板,统计一个给定值在vector中出现的次数。并且为该模板编写特例化版本来处理vector<const char *>
。
template<typename T>
size_t compute(const vector<T>& vec, T key_value)
{
size_t count = 0;
for (auto& it : vec)
{
if (it == key_value)
++count;
}
return count;
}
template<>
size_t compute(const vector<const char*>& vec, const char* key_value)
{
size_t count = 0;
for (auto &it : vec)
if (strcmp(it,key_value)==0)
++count;
return count;
}
例子3:对debug_rep进行特例化,处理const char*的字符指针.
template<>
string debug_rep(const char* p)
{
std::string ret(p);
return ret;
}