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)。

posted @ 2020-02-16 20:56  scyq  阅读(364)  评论(0)    收藏  举报