C 模板簡介(零) 簡介

2021-09-03 08:39:00 字數 1274 閱讀 4148

首先推薦 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 的檢查機制能通過函式引數的不同及所屬類的不同。正確...