C 高階 function應用及底層實現

2021-10-08 11:05:20 字數 2863 閱讀 9695

function 這個東西我了解也不是很多,如有錯誤,請大佬們指正。

function是乙個函式包裝器模板,最早來自boost庫。在c11標準中將其納入標準庫。該函式包裝器模板可以包裝任何型別的可呼叫元素,例如普通函式和函式物件

我老師說,function最大的作用就是保留可呼叫元素的型別

我們先隨便寫幾個函式:

void

hello1()

void

hello2

(string str)

// 型別void (*pfunc)(string)

intsum

(int a,

int b)

class

test

};

然後在主函式中使用function:

function使用:function《返回值型別(引數型別)>

int

main()

; cout <<

func4

(100

,200

)<< endl;

function<

void

(test*

, string)

> func5 =

&test::hello;

func5(&

test()

,"call test::hello!");

return0;

}

先是用函式型別例項化function

然後通過function呼叫相應的operator()函式,傳入相應引數

其中fun4直接對lambda表示式進行了乙個封裝,使其能夠達到和sum函式等同的效果。

func5由於在類中所以要多傳入乙個test*來代替類中的this指標

看到這裡,不禁有個想法?

我直接呼叫函式不好麼?為啥要脫褲子放屁。

後來老師給我演示了這麼乙個例子:

void

doshowallbooks()

void

doborrow()

void

doback()

void

doquerybooks()

void

dologinout()

intmain()

);// insert(make_pair(xx,xx));

actionmap.

insert()

; actionmap.

insert()

; actionmap.

insert()

; actionmap.

insert()

;for(;

;)else

return0;

}

取代了原來笨逼且違反開閉原則的switch——case操作:

而且function能很好的避免以前c++遍地都是類的局面。其實現函式物件機制更能使得編譯器實現內聯呼叫,減少函式呼叫開銷。

//r為返回值型別,a是傳入的引數型別

template

<

typename r,

typename..

. a>

class

myfunction

<

r(a...

)>

r operator()

(a..

. arg)

private

: pfunc _pfunc;

};

利用template的強大機制,用...表示多個傳入的引數。避免了因為引數的個數不同重寫多個myfunction。

諾,就是這樣:

template

<

typename r,

typename a1>

class

myfunction

<

r(a1)

>

r operator()

(a1 arg)

private

: pfunc _pfunc;};

template

<

typename r,

typename a1,

typename a2>

class

myfunction

<

r(a1, a2)

>

r operator()

(a1 arg1, a2 arg2)

private

: pfunc _pfunc;};

*/

說白了,這個就是對函式的一種包裝,本質還是呼叫那個函式。

[2]小天_y,,

svg高階應用及動畫

canvas 和 webgl 這兩項圖形技術結合 css3 可以說能完成絕大部分的動畫和需求。但 canvas 和 webgl 畢竟是偏向底層的繪製引擎,某些場景使用起來還是過於繁瑣的,不分場合一律使用錘子解決的行為不值得提倡。svg 在解決排版,圖示,相關動畫還是非常高效的,而且 svg 還是向量...

C 列舉高階應用

我們經常使用列舉,但是可能只是一些簡單的應用,其實在我們的專案中用到的 下拉列表 model屬性型別等,都可以利用列舉更好的實現。定義列舉 public enum departmenteum 1 下拉列表使用列舉資料來源 繫結部門 var deptlist enumhelper.getcachedd...

C巨集高階應用之

在巨集定義中經常看到 和 現在講一下他們的用法 1,是連線符 用於將兩個引數連線在一起 例如 define a x,y x y 則 a he llo 結果是hello define link a my a 則 link god 相當於 mygod 是一種分隔連線方式 他的作用是先分隔 然後強制連線 ...