看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《gogoqaz (..)》之銘言: : 最近在看Lambda : 有一部份看了很久還是不懂,不知道是他寫太簡捷還是我哪個點沒有抓到 : http://msdn.microsoft.com/en-us/library/dd293599.aspx : 文件在上面 在higher order function的部份 : auto g = [](int x) -> function<int (int)> : { return [=](int y) { return x + y; }; }; function<T> 是一個 class template, 它的用途是把函式物件 (function object/functor)包裝起來, 函式物件包含了以下兩類: 1. 重載了 operator() 的類別 instance 2. pointer to function lambda function 是匿名類別的實體, 該類符合上述 (1), 所以可 以用 function<F> 包裝起來. 對於 g 的解釋, 請看下面例子: int add( int x, int y ) { return x + y; } int f( int y ) { return add( 5, y ); } 上面程式碼中, f() 另外幫你傳了一個引數 5 給 add(), 如此一 來假如你有這樣的需求: "把 vector 內的所有元素都加上 5" vector<int> values = { 1, 2, 3 }; transform( values.begin(), values.end(), values.begin(), f ); 就可以套接給 STL Algorithms 使用, 不需要寫多餘的程式碼. 但是問題如果變成: "把 vector 內的所有元素都加上 n, n=1,2,3...1000" 實作如此巨量的函式已經不是徒手所能辦到, 所以就讓編譯器幫我 們產生需要的 functors. 仔細觀察你可以發現: g 是一個產生器. 像 g(5) 回傳了功能和上述 f() 一樣的函式物件. transform( values.begin(), values.end(), values.begin(), g(5) ); 功能是一樣的, 好處是不必自己補上實作, 不過做簡單的四則運算 你甚至可以不用自己寫產生器出來: // C++03 transform( values.begin(), values.end(), values.begin(), bind1st(plus<int>(), 5) ); // C++11 transform( values.begin(), values.end(), values.begin(), bind(plus<int>(), 5, placeholders::_1) ); : 首先就是上面這邊,不懂為什麼要將int x轉成 function type : 這樣做的用意到底在哪? : 接著 : auto h = [](const function<int (int)>& f, int z) : { return f(z) + 1; }; : 之後 h(g(7),8) output 會是16 : 麻煩大大幫解惑一下 謝謝 h() 接受一個 function object, 為了可用性高它會先用 implicit cast 轉成 function<F>, 並幫你實現: "將 z 代入該函式, 並回傳函數值 +1 的結果" -- ╔═══╗╔═══╗ ╔═╗═╗╔═══╗╔═══╗╔╦═╦╗ 金栽經║ ╔╗ ║║ ╔╗ ║╔╗║ ║ ║║ ═ ║║ ╔╗ ║║║ ║║RAINNOUS ≡≡║ ╚╝ ║║ ╚╝ ║║║║ ║║ ╞╣║ ║║ ║║ ║ ═╣║ ╥ ║║║║ ║ ║║ ═ ║║ ╚╝ ║║ ║ ║ 高佑麗╚═╩═╝╚═╩═╝╚╝╚═╚═╝╚═══╝╚═══╝╚═╩═╝鄭允慧 趙賢榮金智淑盧 乙吳勝雅ψmocki -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
EdisonX:push :) 07/12 17:34
※ 編輯: loveme00835 來自: 140.121.197.115 (07/12 17:34)
gogoqaz:很清楚 感謝你的回答!! 07/12 19:17