C++ 模板簡介(零)—— 簡介

C++ 模板簡介

首先推薦 C++ 官方模板介紹

  1. SFINAE(很多內容被 Concepts 取代)
  2. Meta programming(很多內容被 constexpr 函數取代)
  3. Tuple
  4. Any

(看完上面介紹你就覺得全部講的毫無用處了)

建議你先了解一下模式匹配與模板偏特化是什麼東西,否則你可能 4 篇文章都看不懂。

模式匹配

模式匹配指的是,檢查某一個詞彙序列是否滿足給定的一些模板。對於函數式編程語言來說(當然 C++ 並不是函數式編程語言),函數的參數就可以進行模式匹配,比如:

fac :: Int -> Int -- 定義函數 fac 的類型,你可以理解爲第一個參數是 Int,返回值是 Int
fac 0 = 1 -- 規定第一個參數爲 0 的時候返回值是 1
fac n = n * fac (n - 1) -- 否則對於其他的參數 n,等於 n - 1 的階乘的值乘上 n

上述代碼是一個簡單的模式匹配的例子,我指定了某個參數爲什麼值的時候函數的返回值是什麼。我們再來看一個例子:

len :: [a] -> Int -- 定義函數 len 的類型,你可以理解爲第一個參數爲元素類型任意的列表(數組),返回值是 Int
len [] = 0 -- 如果列表是空的列表,那麼顯然其長度爲 0
len (x:[]) = 1 -- 如果列表只有一個元素,那麼顯然其長度爲 
len (x:xs) = 1 + len xs

len 函數的參數我們分了 3 種情況討論,而這三種情況都是相互排斥的。我們考慮 C++ 中模板偏特化的模仿:

template <typename T, T... List>
struct len;

template <typename T>
struct len<T> { static const size_t value = 0; };

template <typename T, typename X>
struct len<T, X> { static const size_t value = 1; };

template <typename T, typename X, typename... XS>
struct len<T, X, XS...> { static const size_t value = 1 + len<T, XS...>::value; };

這樣我們就模仿實現了 Haskell 版本的代碼,你可以看到前兩行是類型聲明,之後 3 個 len 一一對應。也就是說,模板的偏特化實際上就是在做模式匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章