最開始在寫乙個 命令模組, 涉及到 簡單命令 和 復合命令。
所有的命令 是通過字串組裝的。
命令的呼叫是通過註冊機制 實現繫結的。
具體的功能封裝在對應的 功能類裡面。
由於復合命令的存在,會導致一條命令 執行多個處理。
所以希望在 註冊的時候,能夠直接將多個物件直接儲存到乙個容器內。
這就會涉及到 不定長引數 儲存的 過程。
在這裡我才用了變長引數模版。
我先定義乙個通用的 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 模板主要分為 函式模板,類模版以及非型別模板。下面我將對這三種模板進行詳細的介紹和說明。廢話少說,首先讓我來看看函式模板究竟是個神馬玩意。一 ...