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 是一種分隔連線方式 他的作用是先分隔 然後強制連線 ...