看板 C_and_CPP 關於我們 聯絡資訊
舉個小例子 typedef int(*funPtr)(int, int); int add(int a,int b) { return a + b; } int sub(int a, int b) { return a - b; } void Math(funPtr callback) { printf("Time to Math class, result = %d\n", callback(5, 1)); } int main() { Math(add); Math(sub); char c = getchar(); return 0; } 其中的 Math(add) 該怎麼敘述他呢? Ans1: 我把add註冊到Math裡面 Ans2: add 是一個callback func 並放到 Math 裡面 大家聽到callback func就知道這func是引數的意思嗎? 不好意思 新手問題 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 150.117.206.89 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1492845281.A.922.html
x000032001: 2 你並沒有註冊他 只是傳進去 1很奇怪 04/22 15:24
cuteSquirrel: Math(add)是把add這隻function的以function pointer 04/22 15:45
cuteSquirrel: 的形式傳入Math的參數列。讓裡面的Math呼叫可以用fu 04/22 15:45
cuteSquirrel: nction pointer來呼叫add, 做兩數相加的加法運算。 04/22 15:45
cuteSquirrel: Function pointer 提供了一種彈性的函數呼叫方式。 04/22 15:50
cuteSquirrel: 以原po的例子來說,可以再實作兩個數學函數,mul做 04/22 15:50
cuteSquirrel: 乘法,div做除法。擴展成一個小型的四則運算程式。 04/22 15:50
cuteSquirrel: Callback function在原po的例子裡是add和sub. add和 04/22 15:56
cuteSquirrel: sub這兩個以function pointer傳入Math(), 在Math() 04/22 15:56
cuteSquirrel: 裡面被呼叫。 04/22 15:56
cuteSquirrel: Ans2比較貼近原po的例子。 謝謝兩位 我只是好奇我告訴別人說 add & sub 是callback func 這樣我同事們就知道這是要被當作func pointer傳入其他func作為引數嗎? 因為連我自己都無法定義清楚了 冏 ※ 編輯: EngRookie (150.117.206.89), 04/22/2017 16:22:22
kyuudonut: 我覺得改一下函數命名會比較好閱讀一點 04/22 19:17
s89227: 在其他語言好像叫delegate? 04/22 22:47
cuteSquirrel: 推。像是c#的delegate 04/22 23:20
uranusjr: 不過 delegate 在某些語境下又會有完全不同的意思 XD 04/22 23:31
steve1012: 應該知道吧 04/22 23:45
loveflames: C++講delegate,我第一個想到的是delegating ctor 04/23 08:26
CoNsTaR: higher-order function 04/24 19:18
Chikei: 不過用higher-order有不小的機會會被問這是啥意思...XD 04/25 01:17
Neisseria: higher-order function +1 04/25 09:40
ah7675: 每次都要搞名詞解釋 真的很煩 04/26 00:12
ah7675: 是不是都用名詞當鬥爭工具? 講贏定義的人是老大? 04/26 00:12
CoNsTaR: 樓上 這裡的老大只有一個喔 請去拜見水晶球神 04/26 05:38
CoNsTaR: 不過這篇本來就是在問名詞,給名詞解釋問題在哪? 04/26 05:40
ronin728: 只傳函數進去不算callback,必須是要是下個流程才算(CPS 04/26 11:29
ronin728: 也就說傳進來的函數也必定只能以tail call的方式使用 04/26 11:39
Killercat: 你可以查一下學一下functor, 近代的c++多半用這結構 04/26 22:37
Killercat: 體來表示一個function 而不是把point of function傳入 04/26 22:37
Killercat: 優點很多,包括了簡易的型別安全以及易用性 可以學一下 04/26 22:39
Killercat: C++11以前須用boost::function,11後有std::function 04/26 22:41
Killercat: https://tinyurl.com/7lsdvjj 04/26 22:41
Sidney0503: 名詞是設計者的問題 template在c++ java不一樣 04/27 07:23
Sidney0503: apply bind在c++ js不一樣 04/27 07:23
Sidney0503: for each拿到index還是內容物 在py js不一樣 04/27 07:27
Sidney0503: 不過打架久了大家也漸漸知道 先說是哪家語言的定義 04/27 07:29
Sidney0503: 如果你覺得煩 那就可以加入語言開發社群或委員 04/27 07:30
Sidney0503: 出一份力改善這種到處不一樣的狀況 04/27 07:31
Chikei: 名詞解釋有啥好煩的,難道要吵一架吵完之後才發現兩個人跟 04/27 11:25
Chikei: 本是在講不同的東西只是剛好共用名詞有比較好嗎XDD 04/27 11:26
CoNsTaR: 通常在討論語言特性的時候會用higher-order function 04/27 12:30
CoNsTaR: 用 category 討論程式實作會用 functor 這個詞 04/27 12:30
CoNsTaR: 雖然這兩個詞在 theorical computer science 裡實際上指 04/27 12:30
CoNsTaR: 的是同一個東西,但是在不同情境下我們會用不同的詞來討 04/27 12:30
CoNsTaR: 論 04/27 12:30
CoNsTaR: 另外, functor 還分 contravariant、 convariant 兩種, 04/27 12:30
CoNsTaR: 但 higher-order function 就沒討論這麼多了 04/27 12:30
CoNsTaR: 不過 functor 在很多語言裡已經有自己的意思了,和 TSC 04/27 12:30
CoNsTaR: 裡的定義不同 04/27 12:30
CoNsTaR: functor 雖然也可以傳入、回傳函數,但是專指這樣的函數 04/27 12:45
CoNsTaR: 會用 higher-order function 來稱呼 04/27 12:45