變長引數模版函式初探

2021-08-13 22:04:06 字數 2403 閱讀 5110

最開始在寫乙個 命令模組, 涉及到 簡單命令 和 復合命令。

所有的命令 是通過字串組裝的。

命令的呼叫是通過註冊機制 實現繫結的。

具體的功能封裝在對應的 功能類裡面。

由於復合命令的存在,會導致一條命令 執行多個處理。

所以希望在 註冊的時候,能夠直接將多個物件直接儲存到乙個容器內。

這就會涉及到 不定長引數 儲存的 過程。

在這裡我才用了變長引數模版。

我先定義乙個通用的 key-value 的 變長模版, 用於構造乙個容器物件。

指定 當輸入型別 為 key-value:string-string時,對應的處理方法。

當然也可以指定其他型別的引數和對應的處理函式。

template

params

>

mapset register(string key, string value, params

...params)

設定模版擴充套件的終止條件

template

params

>

mapset register()

這樣 就能把想要的引數儲存在對應的容器中。

在使用變長模版函式的過程中,我在想 每個函式都構造乙個物件, 會導致接收的時候都呼叫拷貝構造。

所以我在定義容器的時候,定義了拷貝構造,和右值引用構造,方便檢視呼叫過程。

最開始,我沒有實現 右值引用,只是實現拷貝構造

mapset(const mapset& map_set) 

mapset(mapset& map_set)

結果如圖:

後來加入 右值引用

mapset(mapset&& map_set) 

}

結果如圖:

發現 沒有觸發右值引用

再次修改**

template

params

>

mapset register(string key, string value, params

...params)

結果如圖:

現在已經觸發了 右值引用, 其中8次構造 發生了 7次交換。

後來朋友告訴我 c++ 有返回值優化,於是 去掉std::move,把debug 編譯 換成release 編譯 再次嘗試。

template

params

>

mapset register(string key, string value, params

...params)

結果如圖:

這裡產生2次構造,其中發生一次交換。

這裡不同的編譯器優化效果可能不一樣,下面使用 blade 編譯的

完整**:

#include 

#include

#include

using

namespace

std;

int addref()

class mapset

mapset(const mapset& map_set)

mapset(mapset& map_set)

mapset(mapset&& map_set)

void add(string key, string value)

void print()

}private:

map dictory_;

int index;

};template

mapset register()

template

mapset register(string key, string value, params... params)

int main()

可變長函式引數模板

include 通用可變引數模板 處理不限定個數的引數,處理不同型別 void showall 空函式,介面,最後結束遞迴 新版本編譯 強制預留介面 template 可變長度!void showall const t value,const args args 設計可以修改原來的資料的 t val...

c 變長引數模板函式

c 中有乙個重要特性,那就是模板型別。類似於objective c中的泛型。c 通過類模板來實現泛型支援。類模板,可以定義相同的操作,擁有不同資料型別的成員屬性。通常使用template來宣告。告訴編譯器,碰到t不要報錯,表示一種泛型.如下,宣告乙個普通的類模板 template void foo ...

C 模版初探之函式模板(一)

最近研究了下c 模板,對於c 模板有了乙個初步認識,模板是c 乙個很重要也是用途很廣的乙個屬性,它很好的詮釋了c 的重用屬性。如下是我對模板的學習和總結 c 模板主要分為 函式模板,類模版以及非型別模板。下面我將對這三種模板進行詳細的介紹和說明。廢話少說,首先讓我來看看函式模板究竟是個神馬玩意。一 ...