C++模板心得
C++模板心得
-
我开始学模板的时候一脸懵逼,真的看不懂模板是怎么作用的。因为大多数人的代码把模板声明和函数、类的声明分行写,让我以为模板的作用是全局的,实际上应该像如下理解。
函数模板
template <class type> type func-name(parameter list){ // function body }
模板类
template <class type> class class-name { // code here }
-
template < class T >和template < typename T>没有区别(除了在套娃的时候)
-
在头文件中定义模板类时,在实现时要写出作用域。实例化的时候,要填入其类型。
// in header file template <class T> class Pen{ private: T price, span; public: Pen(T a, T b): price(a), span(b){ } T buyPen(); }; // in source file template <class T> T Pen<T>::buyPen(){ // attention to scope declaration // code here } int main(){ Pen<int> pilot(1500, 10); // declate the template type return 0; }
模板的特殊化
如果在一个模板类中,我们想对某些特定类型数据做特殊处理要怎么办?如下
// for regular data type
template <class T>
class Myclass{
public:
Myclass(T x){
cout << x << " is not a char" << endl;
}
};
// for specific data type
template <>
class Myclass<char>{
public:
Myclass(char x){
cout << x << " is a char" << end;
}
};
首先,我们注意到在特殊化模板里,我们采用了template<>,包含了空的参数。这是在此之前,这个类已有模板类,所有数据类型都应该是可以代入的,所以这里不需要填入任何类型的参数。但是我们需要在后面的类声明中,注意这个< char>,这是尖括号中特殊的参数,表示这个类只有模板数据类型传入的是char才会运行下面的代码。
我们称第一种为通用模板类,第二种为特殊化。
模板函数的特殊化
同样,模板函数也可以特殊化
假如,我先有个泛型函数如下
template <class T>
T test(T& x){
return x + 1;
}
这个函数,对于传入的T为int, double, char等等大多数数据类型都是可以实现的。
但是如果我传入的参数是字符串或者布尔值的话,那么编译器就会报错。
因为它没法给string+1,所以为了可以接收string,我们为string类型专门实现特殊化。
template <>
string test(string& x){
return x + "1";
}
和模板类的特化格式差不多,但是区别在于,模板函数的特化必须从头到尾指明返回的类型和传参的类型,不能再带有泛化内容(T)。