c 11學習筆記(8) 可變引數巨集 函式 模板

2021-09-27 13:53:18 字數 3725 閱讀 3206

可變引數的巨集在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介紹一種通過...