c 11之函式引數包展開

2022-06-23 01:45:11 字數 2541 閱讀 4459

本文略帶總結性,參考:泛化之美--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 其執行過程

print(1, "hello", "c++", 11);

print("hello", "c++", 11);

print("c++", 11);

print(11);

print();

例子中,遞迴終止到第0引數截止。根據執行過程可知,終止函式可以改為1個引數,最後乙個函式僅僅作為終止遞迴使用,終止遞迴改為1個引數的函式還可以提高效能(減少函式的呼叫)。

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.用作輸出每個引數

templatevoid show_arg(const t& t)

; /// (1)

}

**中,(1)的逗號表示式為: (show_arg(args), 0)。先執行表示式1(show_arg(args)),再執行表示式2(0)。 使用呼叫**expand(1, 2, 3, 4),(1)處的逗號表示式展開結果如下

int arr = ;
而,第乙個逗號表示式結果為0, 第二逗號表示式的結果為0, .... 最後乙個逗號表示式展開後,逗號表示式的結果為0,所以(1)的**最後是這樣的:

int arr = ; /// (2)
(2)的**宣告了乙個int陣列,陣列有4個元素。 展開引數包的方式相當巧妙,比起遞迴,更加方便了。

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...