16.62
namespace std{
template<>
class 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<int>()(s.units_sold)^hash<double>()(s.revenue);
}
}
16.63
template<typename T>
size_t countInVec(vector<T> vec, const T & key){
return count(vec.cbegin(),vec.cend(),key);
}
int main() {
vector<int> vecI = {1,2,3,4,5,5,5,5,5};
vector<double> vecD = { 1.7,2.6,3.3,4.1,5.2,5.3,5.4,5.5,5.5 };;
cout << countInVec(vecI, 5) << endl;
cout << countInVec(vecD, 5.5) << endl;
for (;;);
return 0;
}
16.64
template<typename T>
size_t countInVec(vector<T> vec, const T & key){
return count(vec.cbegin(), vec.cend(), key);
}
template<>
size_t countInVec(vector<const char *> vec, const char* const & key){
size_t count = 0;
for(vector<const char *>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it){
if(strcmp((*it),key) == 0){
count++;
}
}
return count;
}
int main() {
vector<int> vecI = {1,2,3,4,5,5,5,5,5};
vector<double> vecD = { 1.7,2.6,3.3,4.1,5.2,5.3,5.4,5.5,5.5 };
vector<const char *> vecC = { "1","3","4"};
cout << countInVec(vecI, 5) << endl;
cout << countInVec(vecD, 5.5) << endl;
const char * c = "soo";
cout << countInVec(vecC, c) << endl;
for (;;);
return 0;
}
16.65
template<>
string debug_rep(char * const& p){
return debug_rep(string(p));
}
template<>
string debug_rep(const char*const& p) {
return debug_rep(string(p));
}
16.66
定义函数模版的特例化版本时,我们本质上接管了编译器的工作,即,我们为原模版的一个特殊实例提供了定义,重要的是要弄清:一个特例化版本本质上是一个实例,而非函数名的一个重载版本,不会影响函数匹配
优点:特例化只是一个实例,并不是重载函数,所以会减少重载函数的资源消耗
缺点:当有函数重载时,优先级会比重载函数低
16.67
定义函数模版的特例化版本时,我们本质上接管了编译器的工作,即,我们为原模版的一个特殊实例提供了定义,重要的是要弄清:一个特例化版本本质上是一个实例,而非函数名的一个重载版本,不会影响函数匹配