引入原因
定义
(1) 函数模板特例化
将原模板的所有模板参数提供实参
#ifndef LEETCODE_TMP_H
#define LEETCODE_TMP_H
#include <string.h>
using namespace std;
template<typename T> // 模板函数
int compare(const T& v1, const T& v2) {
cout << "T" << endl;
if (v1 > v2) return -1;
else if (v1 < v2) return 1;
else return 0;
}
// 模板特特例化,满足针对字符串特定的比较,要提供所有实参,这里只有一个T
template<>
int compare(const char* const &v1, const char* const &v2) {
cout << "char*" << endl;
return strcmp(v1, v2);
}
template<>
int compare(const double &v1, const double &v2) {
cout << "double" << endl;
if (v1 > v2) return -1;
else if (v1 < v2) return 1;
else return 0;
}
#endif //LEETCODE_TMP_H
在main.cpp中这样写:
打印:
T 1 double 1 char* -1(2)类模板特例化
特例化时,仍然用template<>表示是一个特例化版本,例如
template<> class hash<sales_data> { size_t operator()(sales_data& s); //里面所有T都换成特例化类型版本sales_data //按照最佳匹配原则,若T != sales_data,就用普通类模板,否则,就使用含有特定功能的特 //例化版本。 };不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个类模板的部分特例化本身仍是
模板相同,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板)
可以特例化类中的部分成员函数而不是整个类
#ifndef LEETCODE_TMP_H #define LEETCODE_TMP_H #include <string.h> using namespace std; template<typename T> // 模板函数 class Foo{ public: void Bar() { cout << "T" << endl; } void Barst(T a) {} }; // 模板特特例化,满足针对字符串特定的比较,要提供所有实参,这里只有一个T template<> void Foo<int>::Bar() { cout << "int" << endl; }; #endif //LEETCODE_TMP_Hc文件:
打印:
T int
No comments yet.