引入原因

定义

(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_H

c文件:

打印:

T
int