模板特化

模板

  • 模板是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

posted @ 2022-04-05 10:47  oumae  阅读(122)  评论(0编辑  收藏  举报