1. 程式人生 > >模板的特化和偏特化

模板的特化和偏特化

       模板在C++中可謂是一個極其重要的特性,可謂是構成C++設計思想的靈魂部分,所謂的泛型程式設計就是模版的一種體現。但是呢,作為C++如此重要的特性,其實在平時工作當中用到的並不多。或者說我們平時工作只用到了其中的一部分,而其實模板的內容也很豐富。例如,被程式設計師廣為使用的STL其內在的實現方式就充斥著大量的模板使用。不過,畢竟STL這種東西平時程式設計師也不會去自己實現它吧。

       模板有幾個主要的概念,類模板,函式模板,模板特化,模板偏特化,模板例項化。這幾個概念其實是很容易混淆的。使用的時候也需要特別注意。

       函式模板:當我們的函式功能類似,而只是其中處理的資料型別不同時,我們就可以採用函式模板。從而實現程式碼複用。具體格式如 template <typename T,...>或 template<class T,...> ,可以有多個引數,甚至是另一個模版

       類模版:顧名思義,就是當一個類要實現的功能只是因為資料型別不同,而需要進行多個類的設計的時候,我們就往往需要將這個類設計成一個模版類。而這個模版就是類模版。具體格式如template<typename T> 或template <class T>,可以有多個引數,甚至是另一個模版

       模版的特化:模版的特化和模版的例項化是有所區別的。

       模版的例項化是指在編譯過程中,制定模版當前所表示的具體的資料型別,當然,與之相對應的則是類的例項化,類的例項化是在執行過程中的。這裡是有所區別的。由於模版的例項化是需要編譯器根據相關規則進行推導的,所以為了避免軟體的執行負擔,都會將這部分工作在編譯過程中進行完成。這個就是模版例項化的過程。

       而模版的特化,則是發生在比編譯過程更早的模版定義的過程中。即在模版定義的過程中,就針對某一種資料型別的特殊性,進行設定的類模版。例如

// 定義類的模版
template <class T>
class Demo{};
//針對bool型資料,進行的模版的特話
template <>
class  Demo<bool>{
};
            從而我們知道了一個時間的順序,模版的特化發生在定義時期,模版的例項化發生愛編譯時期,類的例項化發生在執行時起。

        模版的偏特化從類模版的特化中去了解偏特化,就相對要容易一點。由於模版是存在一個模版引數列表的,而當模版引數列表的引數不止一個,而特化過程中,針對模版引數列表中的某一部分進行特化,這個過程就稱為模版的偏特化。具體如

// 定義類的模版,兩個模版引數
template <class T,class N>
class Demo{};
//針對bool型進行便特化,其他的引數仍需定義模版
template <class T> //定義非特化的模版引數

class  Demo<T,bool>{// 定義特化為bool型的模版類,仍舊為模版類
};


        模版的例項化的示例程式碼如下:

    std::cout << "Hello, World!\n";
    Demo<int,bool> demoA;// 具體定義一個類就是模版的例項化了

        當然,模版還有很多極為靈活和巧妙的用法,而且也遠比其他語言更有設計哲學,但是也正因為如此才造成了C ++模版的艱澀難懂,而博主現在也只是對這些概念和定義有所掌握,對於更為深層次的東西,依然需要探索。