首先推薦 c++ 官方模板介紹
sfinae(很多內容被 concepts 取代)
meta programming(很多內容被 constexpr 函式取代)
tuple
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
;template
<
typename t,
typename x>
struct len
;template
<
typename t,
typename x,
typename..
. xs>
struct len>
;
這樣我們就模仿實現了 haskell 版本的**,你可以看到前兩行是型別宣告,之後 3 個len
一一對應。也就是說,模板的偏特化實際上就是在做模式匹配。 C 模板簡介
標籤 c template 對於c 模板,之前很少使用,這裡整理下,以備後忘。先來看下面2個加法函式 int sum int a,int b double sum double a,double b 上面的2個函式,雖然它們的返回值和引數型別不一致,但函式名和函式體完全一致。如果能提煉出乙個通用函式...
c 模板簡介
一.函式模板 1.模板的基本格式 include using namespace std template void swap t a,t b,t size 執行結果 a交換之前1234 b交換之前2345 a交換之後2345 b交換之後1234 2.模板實參的使用 include using na...
C 模板類簡介
c 模板類簡介 模板就是實現 重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數,從而實現了真正的 可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。1.模板的概念。我們已經學過過載 overloading 對過載函式而言,c 的檢查機制能通過函式引數的不同及所屬類的不同。正確...