可變引數的巨集在c語言中就有定義,使用…,在巨集定義中表示可變引數;使用va_args替代巨集定義中的可變引數。
比如我們想要定義printf()函式為巨集pr,下面是乙個簡單的例子:
// 巨集定義pr為printf函式
#ifndef pr
#define pr(pstr, ...) \
printf(pstr, __va_args__);
#endif
intmain
(int argc,
char
** ar**)
函式的執行結果為:
10,20
下面是乙個求和的乙個函式
int
getsum
(int count,..
.)intmain
(int argc,
char
** ar**)
上面程式執行結果為:615
這是乙個求和函式,函式中count表示引數的個數;va_list型別的ap用來輔助獲取引數。這裡首先使用函式va_start()對ap進行初始化,使ap變成了乙個邊長引數的控制代碼;然後使用函式va_arg()將引數一一取出進行運算;最後使用函式va_end()結束操作。
使用可變引數模板時,在typename或者class後面加上三個點(…)表示可變引數模板。使用sizeof…可以獲取引數的個數; 下面是乙個簡單的例子
template
<
typename..
. t>
void
f(t.
.. args)
intmain
(int argc,
char
** ar**)
程式的輸出結果為23
4關於可變引數模板的展開有兩種方式,一種是遞迴形式的展開;必須要定義乙個終止函式,如下面的程式:
template
<
typename t>
void
func
(t t)
template
<
typename t,
typename..
. args>
void
func
(t head, args.
.. args)
intmain
(int argc,
char
** ar**)
終止函式是為了遞迴終止時使用的,上面的**展開為:
func(1, 2, 3, 4, 5);
func(2, 3, 4, 5);
func(3, 4, 5);
func(4, 5);
當遞迴到func(4, 5)時,head傳遞4, 呼叫已經具化的函式func(5)。
可以簡單寫乙個求和的模板函式:
template
<
typename t>
t sum
(t t)
template
<
typename t,
typename..
. args>
t sum
(t head, args.
.. args)
intmain
(int argc,
char
** ar**)
上面的的程式執行結果為:
15可以使用初始化引數列表的形式展開函式模板, 首先看一下下面的**:
template
<
typename t>
void
printtag
(t t)
template
<
typename..
. args>
void
expand
(args.
.. args);}
intmain
(int argc,
char
** ar**)
上面的**展開為:
int array = ;
同理也可以使用初始化引數列表的形式:
template
<
typename func,
typename..
. args>
void
expandfunc
(const func& f, args.
.. args);}
intmain
(int argc,
char
** ar**),1
,2,3
);}
這裡使用的std::forward實現完美**,關於完美**可參考這篇文章
c++11學習筆記(5)- 引用摺疊和完美**
lambda表示式傳遞func,引數1,2,3分別呼叫該lambda表示式。
我們要實現乙個函式**類,這個類的用法如下:
class
testfuncobject
intrunfunc2
(int a,
int b,
int c)
}int
main
(int argc,
char
** ar**)
函式createdelegate建立乙個**類,然後直接使用該**函式就可完成被**函式。
函式的執行結果為:
3050
下面時**函式和**類的具體實現:
template
<
typename t,
typename r,
typename..
. args>
class
mydelegate
r operator()
(args.
.. args)
private
: t* m_t;
r (t::
*m_f)
(args...
);};
template
<
typename t,
typename r,
typename..
. args>
mydelegate>
createdelegate
(t* t,
r(t::
*f)(args...
))
mydelegate為**類,過載了(),為乙個仿函式。m_t為物件指標,m_f為該物件的函式指標。createdelegate為**函式。 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...
c 11 之可變引數模板
目的 包含0到任意個模板引數 宣告可變引數模板需要在typename或class 後面加上省略號 一 可變引數模板函式 template void f t.args cout 可變引數展開有兩種方式 1.通過遞迴的模板函式來將引數展開 2.通過逗號表示式和初始化列表方式展開引數包 對於1介紹一種通過...