C++模板特化功能
机器学习入坑者 人气:0前言:
通过定义模板,使得函数或者类不依赖于特定的类型,这样大幅提升了代码的复用性。
然而,不管是类模板还是函数模板,对所有的类型都是采用相同的处理方式(同一份代码)。为此,C++提出了“模板特化的概念”,对特定类型提供模板的改造。
比如,对于函数模板来说,可以通过特化指定特定的类型,针对此特定类型对函数体内容进行重写,使得函数对特定类型实现特定功能。
注意:
按照语法,对函数模板和类模板进行特化后,就变为普通函数和普通的类,而不再是模板。
1、函数模板的特化
对于函数模板来说,其特化语法如下:
template <>
返回类型 已定义的函数模板名<具体类型>(参数表){
针对特定类型的具体实现;
}
其中“template <>
”是特化的固定格式。下面的例子定义了函数模板play(),并对此模板进行特化,特化过程中指定具体类型为“int”:
// 已定义好的函数模板 template <class Q> void play(Q p) { printf("play with Q! \n"); } // 对以定义好的函数模板play()进行特化 template <> void play<int>(int) { printf("play with int! \n"); }
2、类模板的特化
类模板进行特化的语法如下:
template <>
class 类模板名<具体类型>{
类定义;
}
类模板的成员函数在类外实现时,语法如下:
返回类型 类模板名<具体类型>::函数名{
函数体;
}
下面是对类模板Duck进行特化的代码,特化过程中指定了类型为"int
":
template <class T> class Duck { public: void run() { printf("T run! \n"); } }; // 对类模板Duck进行特化 template <> class Duck<int> { public: void run(); }; // 成员函数在模板类以外实现 void Duck<int>::run() { printf("int run! \n"); }
加载全部内容