c 模板與泛型程式設計5 模板的靈活性

2021-10-04 03:53:26 字數 1586 閱讀 8682

這篇文章中c++ primer 用兩種智慧型指標舉例子

shared_ptr和unique_ptr如何指定刪除器的差異實際上就是這兩個類功能的差異。

我們先看一下如何定義shared_ptr的刪除器

學習自csdn的**

在建構函式的時候傳入函式的指標:

#include #include #include "template.h"

using namespace std;

class ******;

void deleter(****** *)

在建構函式的時候使用仿函式

我們可以這樣看乙個例子

class deleter

};// 建構函式傳遞自定義刪除器指標

int main()

我們通過運算子過載,可以將類過載成乙個類似與函式的呼叫方式

deleter del;

******* data = new ******();

del(data);

這樣也會觸發deleter function called

lambda表示式?

這個內容真的不是很懂,不知道什麼是lambda

std::shared_ptrp3(new sample[5], (sample *x) );
第一次聽說c++ 的這個東西

下面我們看一下這個lambda表示式:

原來lambda表示式就是乙個閉包,也就是我們俗話說的php中的匿名函式,基本是只用一次所以也不需要函式名字,js中也有閉包

乙個最簡單的lambda表示式

{} ();
void f()

int main()

如果說這個了解了那上面的函式非常容易看懂了

#include #include #include #include #include #include #include "template.h"

using namespace std;

class ******;

// 建構函式傳遞自定義刪除器指標

int main() );

return 0;

}

第四種方式是使用default_delete

std::shared_ptrp (new ******[5],std::default_delete());
我們再來看一下unique_ptr是如何指定刪除器的

unique_ptr 這種就不再贅述了,只是在模板中定義出函式,然後在傳入引數的時候做出實現就可以了

詳細的可以參考csdn

總結最後我們可以看出shared_ptr並不是直接將刪除器儲存為乙個成員,因為刪除器的型別直到執行的時候才會直到,實際上刪除器的型別我們可以隨時改變,unique_ptr的刪除器型別在編譯的時候就是知道的,unique_ptr避免了間接呼叫刪除器的開銷。通過執行時候繫結刪除器,shared_ptr使使用者過載刪除器更加方便。

C 模板與泛型程式設計

1 物件導向程式設計總是以顯式介面和執行時多型解決問題。模板及泛型世界不同,在此世界中顯式介面和執行時多型仍然存在,但重要性降低,反倒是隱式介面和編譯器多型移到前頭。執行時多型和編譯時多型 前者表示哪乙個虛函式該被繫結,後者表示哪乙個過載函式該被呼叫。顯式介面由函式的簽名式 函式名稱 引數型別 返回...

模板與泛型程式設計

模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...

模板與泛型程式設計

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...