本文略帶總結性,參考:泛化之美--c++11可變模版引數的妙用
用下面的函式可以實現查詢引數包的個數
templateunsigned int length(args... args)
呼叫
length(1, "hello", "c++", "11"); // 返回4,4個引數
3.1注意, 遞迴展開需要考慮爆棧的情況。 說到這裡,ubuntu(linux) 預設棧大小8m(使用命令 ulimit -a檢視), win下,visual studio 預設棧大小1m(聯結器->系統)。3.2 需要兩個函式:遞迴終止函式和遞迴函式
3.3 乙個例子,輸出各個元素。函式引數為引數包的形式,使用遞迴展開.
// 1.遞迴終止函式
void print()
// 2.遞迴執行函式
templatevoid print(t head, args... args)
3.4 呼叫及執行結果3.5 其執行過程例子中,遞迴終止到第0引數截止。根據執行過程可知,終止函式可以改為1個引數,最後乙個函式僅僅作為終止遞迴使用,終止遞迴改為1個引數的函式還可以提高效能(減少函式的呼叫)。print(1, "hello", "c++", 11);
print("hello", "c++", 11);
print("c++", 11);
print(11);
print();
3.6 遞迴終止改為乙個引數同樣的,執行上面的呼叫**// 1.遞迴終止函式
templatevoid print(const t& t)
// 2.遞迴執行函式
templatevoid print(t head, args... args)
print(1, "hello", "c++", 11);
,其執行過程如下print(1, "hello", "c++", 11);
print("hello", "c++", 11);
print("c++", 11);
print(11);
3.7 再看乙個遞迴求和的例子, 同樣是使用引數包的形式逗號表示式?了解一下// 1.遞迴終止函式
template t sum(const t& t)
// 2.遞迴函式
template t sum(const t& head, const args... args)
4.1 回到上面print的例子,改為逗號表示式**中,(1)的逗號表示式為: (show_arg(args), 0)。先執行表示式1(show_arg(args)),再執行表示式2(0)。 使用呼叫**// 1.用作輸出每個引數
templatevoid show_arg(const t& t)
; /// (1)
}
expand(1, 2, 3, 4)
,(1)處的逗號表示式展開結果如下而,第乙個逗號表示式結果為0, 第二逗號表示式的結果為0, .... 最後乙個逗號表示式展開後,逗號表示式的結果為0,所以(1)的**最後是這樣的:int arr = ;
(2)的**宣告了乙個int陣列,陣列有4個元素。 展開引數包的方式相當巧妙,比起遞迴,更加方便了。int arr = ; /// (2)
4.2 使用lambda + 逗號表示式展開引數包還是同樣的例子,輸出引數包元素。
templatevoid show_args(const func &f, args&... args);}
// 呼叫
show_args((const int & item) , 1, 2, 3, 4); /// 輸出: 1, 2, 3, 4,
C 11包擴充套件
c 11的包擴充套件,記錄一下 吧,採用萬能引用,萬能引用再配合std forward又是完美 我個人還是覺得能清晰表達 盡量不要用這麼奇奇怪怪的語句吧?完美 可以考慮,確實降低的拷貝的成本。今天在github看乙個人執行緒池的demo,發現他的執行緒池裡充滿了這些奇奇怪怪的寫法,明明是乙個普普通通...
C 11可變引數函式模板
在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 include include using namespace std class logger static void makeloggeroff static bool loggerstate t...
C 11可變引數函式模板
2013 04 27 13 34 4162人閱讀收藏 舉報 c 模板 25 c c 84 在log時引數是型別和個數是不固定的,所以在做log函式時,很多煩惱,不過c 11給我們帶來的希望 這個是今天剛讀到的,加上自己的理解為位元組寫了乙個logger類,也給大家瞧瞧啊,歡迎大蝦拍板轉 cpp vi...