c 11中的匿名函式(lambda表示式)

2021-10-05 12:55:08 字數 2885 閱讀 8560

status_t lwomx::allocatenode(

char const* name,

spconst& observer,

sp* omxnode) ));

return transstatus == no_error ? fnstatus : transstatus;

}returnomx::allocatenode(const hidl_string& name, const sp& observer, allocatenode_cb _hidl_cb)

[&fnstatus, omxnode](status status, spconst& node) 這是個什麼東東?

本著一顆熱愛學習的心,我研究(度)了一下。

原來這個東東就是c++11中的新功能:匿名函式(lambda表示式)

所以呢?啥叫匿名函式?別著急,繼續往下看。

顧名思義: 匿名函式, 就是定義時未直接指定名稱的函式.

匿名函式有啥優點呢?

非匿名函式在定義時,就已經建立函式物件和作用域物件;所以,即使未呼叫,也占用記憶體空間;

匿名函式,僅在呼叫時,才臨時建立函式物件和作用域鏈物件;呼叫完,立即釋放,所以匿名函式比非匿名函式更節省記憶體空間.

匿名函式表示式格式如下:

[capture] (parameters) mutable exception attribute -> return_type
必須用方括號括起來的capture列表來開始乙個lambda表示式的定義。

如果函式體只有乙個return語句,或者返回值型別為void,那麼返回值型別宣告(capture)可以被省略:

lambda函式的使用場景1:

std::vectorsome_list;

int total = 0;

std::for_each(begin(some_list), end(some_list), [&total](int x) );

// 這裡[&total](int x) 就是lambda函式。total就表示list中所有元素只和。

看到這裡,估計又有人問,for_each是個啥?

for_each也是c++11的新功能,大概看一下:

templatefunction for_each(inputiterator beg, inputiterator end, function f)
看到這裡就比較清晰了,上面對lambda的應用實際就是把some_list中的元素逐個當做引數傳給lambda函式,然後把所有元素加起來。

lambda函式的使用場景2:

#include #include #include double eval(std::functionf, double x = 2.0)

int main()

; auto f1 = (double x);

decltype(f0) fa[3] = };

std::vectorfv = ;

fv.push_back ((double x));

for(auto &f : fv)

std::cout << "fv: " << f(2.0) << std::endl;

for(auto &f : fa)

std::cout << "fa: " << f(2.0) << std::endl;

std::cout << "eval(f0): " << eval(f0) << std::endl;

std::cout << "eval(f1): " << eval(f1) << std::endl;

std::cout << "eval(): " << eval((double x)) << std::endl;

return 0;

}

執行結果:

fv: 1

fv: 2

fv: 4

eval(f0): 1

eval(f1): 2

eval(): 4

這裡其他幾個都好理解,我們看看最後乙個eval((double x)) ,這裡首先是函式eval,他的第乙個引數是乙個函式,這個函式的定義在呼叫eval的地方,也就是(double x),所以,呼叫eval((double x) 就是把eval第二個引數double x賦值給第乙個引數(函式f)的形參x,然後對x求平方並返回。

了解了這些之後,我們再來看omx裡面allocatenode函式的意思:

陰影部分就是lambda函式的的定義。

_hidl_cb(tostatus(ok), new twomxnode(instance));
這裡是對lambda函式的呼叫,實際就是把tostatus(ok)賦值給上面的status status,把new twomxnode(instance)賦值給spconst& node。然後,後面的操作就是函式體裡面的過程。

emmm……到這裡就全部結束了,下班回家~

C 11中的匿名函式(lambda)

c 11提供了對匿名函式的支援,稱為lambda函式 也叫lambda表示式 下面舉了幾個lambda函式的例子 int x,int y 隱式返回型別 int x 沒有return語句 lambda 函式的返回型別是 void 沒有引數,僅訪問某個全域性變數 與上乙個相同,省略了 指定返回型別 in...

c 11匿名函式Lambda

定義乙個lambda函式 auto f capture params opt ret f 呼叫函式其中 capture表示捕獲函式作用域外的外部變數 params是引數 非必須 opt是函式選項,例如可選擇是否允許更改capture到的外部變數 ret表示函式返回型別,一般可以免了,因為我們在f前面...

lambda 函式或者匿名函式(C 11)

lambda 函式也就是沒有名字的函式,一般情況下,在任何地方,如果需要把乙個函式作為引數給出,但你寧願給出乙個簡短即時函式定義,而不是乙個指向原始檔其他地方或者另乙個模組中提供的定義的指標時,lambda 函式可能是有用的,lambda 函式可以作為 動態 給出的乙個快捷方便的函式,而不是正式定義...