模板特化
模板
- 模板是C++泛型编程的一种技术
- 在减少代码冗余的同时仍然可以提供类型安全
- 能够在编译器生成对应类型的代码,实现编译器多态,增强代码复用
模板分为类模板和函数模板,声明方式相同,在类定义/函数定义之前声明模板参数列表
// 类模板
template <class T1, class T2> // T1、T2为模板参数列表
class A
{
T1 data1;
T2 data2;
};
// 函数模板
template <class T>
T max(const T lhs, const T rhs)
{
return lhs > rhs ? lhs : rhs;
}
模板特化
-
对于某些特定的参数类型,你可能有更好的实现。对于这些特定的类型,单独指定实现,优先进行匹配。
-
特化分为全特化与偏特化。全特化就是限定死模板参数列表的具体类型,偏特化则只限定模板参数列表中的某一部分。
类模板
- 类模板既有全特化也有偏特化
template<class T1, class T2>
struct Test
{
Test() { cout << "类模板" << endl; }
};
template<> // 此处的<>中的参数为空
struct Test<int, double>
{
Test() { cout << "全特化" << endl; }
};
template<class T>
struct Test<T*, int>
{
Test() { cout << "偏特化" << endl; }
};
//template<class T> // 无效的模板参数,没有对应的普通模板!!!
//struct Test<T*>
//{
// Test() { cout << "偏特化" << endl; }
//};
//template<class T *> // 无效的模板参数
//struct Test
//{
// Test() { cout << "指针模板" << endl; }
//};
void testClassTemplate()
{
Test<char, double> t1; // 类模板
Test<int, double> t2; // 全特化
Test<int *, char> t3; // 类模板
Test<int*, int> t4; // 偏特化
}
- 以template<>开头的模板类就是全特化模板类
函数模板
- 函数模板只有全特化没有偏特化,因为偏特化的功能可以通过函数重载完成
//模板函数
template<typename T1, typename T2>
void fun(T1 a , T2 b)
{
cout<<"模板函数"<<endl;
}
//全特化
template<>
void fun<int ,char >(int a, char b)
{
cout<<"全特化模板"<<endl;
}
//函数不存在偏特化:下面的代码是错误的
//template<typename T2>
//void fun<char,T2>(char a, T2 b)
//{
// cout<<"偏特化"<<endl;
//}
template<typename T1> // 函数模板不存在偏特化
void fun(int i, T1 t) // 此处为函数重载
{
cout << "模板函数fun" << endl;
}
void testFuncTemplate()
{
fun(3.14, 2); // 模板函数
fun(1, 1); // 模板函数fun
fun(1, (char)1); // 全特化模板
}
其他
- 无论是全特化还是偏特化,都必须包含一个普通模板的定义
- 只定义特化模板而不定义普通模板,会编译报错
- 特化模板即于对于某些参数类型,单独指定其实现方式。在编译期匹配时,用指定的实现方式来生成代码。
参考博客:
https://harttle.land/2015/10/03/cpp-template.html
https://www.cnblogs.com/diegodu/p/4627044.html