参考文献:C++模板全特化,偏特化(局部特化)_c++ 偏特化-CSDN博客
C++ 模板特化与偏特化_模板偏特化-CSDN博客
模板特化
定义
模板特化是指为特定的模板参数类型提供一个专门的实现。当使用这个特定类型时,编译器会优先选择这个特化版本,而不是通用的模板定义。模板特化有时也称之为模板的具体化,分为函数模板特化和类模板特化。
函数模板特化
假设我们有一个简单的模板函数,用于比较两个值是否相等
template<typename T>
bool isEqual(T a, T b) {return a == b;
}
但是当处理指针类型时,上述代码比较的是指针的值(地址),如果我们想要比较指针所指向的值是否相等,就可以对指针类型进行特化
#include<iostream>
using namespace std;
template<typename T>
bool isEqual(T a, T b) {return a == b;
}template<>
bool isEqual<int*>(int* a, int* b) {return *a == *b;
}
int main() {int a = 2;int b = 2;cout << isEqual(&a, &b) << endl;
}
类模板特化
#include<iostream>
using namespace std;
template<typename T,typename U>
class A {
public:T first;U second;A(T t,U u):first(t),second(u){}void printf_A() {cout << first << " " << second << endl;}
};template<>
class A<int, int> {
public:int first;int second;A(int t, int u) :first(t), second(u) {}void printf_A() {cout << first << " " << second << endl;}
};
int main() {A<string, string> a("张三", "李四");//使用普通类模板a.printf_A();A<int, int> b(1, 2);//使用特化的类模板b.printf_A();}
模板偏特化
定义
模板偏特化是一种对模板部分参数进行特化的机制。与模板特化不同的是,它不是为所有模板参数指定具体类型,而是只对其中的一部分参数进行特殊化处理。这种方式在处理具有多个模板参数的模板(特别是类模板)时非常有用,可以根据部分参数的特性来提供不同的模板实现,从而更好地适应复杂的类型组合。
偏特化从两个方面说起,一个是从模板参数数量上,一个是从模板参数的范围上
数量上:
#include <iostream>using namespace std;
template<typename T, typename U, typename W>
struct TCP
{void testfunc(){cout << "TCP普通版本" << endl;}
};template<typename U>
struct TCP<int, U, double>
{void testfunc(){cout << "TCP int, U, double 偏特化版本" << endl;}
};
int main()
{TCP<int, double, int> tcp;tcp.testfunc();TCP<int, double, double> tcp1;tcp1.testfunc();
}
范围上:
#include <iostream>using namespace std;
template<typename T>
struct TC1
{void testfunc(){cout << "TC1普通版本" << endl;}
};
//模板参数范围上的特化版本。
template<typename T>
struct TC1<const T>//const T的特化版本
{void testfunc(){cout << "TC1 const T的特化版本" << endl;}
};