看板 C_and_CPP 關於我們 聯絡資訊
最近在c++看到這東西,感覺很厲害,想試試看一直疊上去。 首先是 void foo(int) { std::cout << "fo is called with: " << i << "\n"; } 然後 using foType = std::function<void(int)>; int main() { foType f1 = std::bind(&foo,std::placeholders::_1); f1(5); } 這樣會輸出 fo is called with: 5 這樣算一層。 如果加個 void foAndFo(foType fo) { std::function<void(int)> fos = std::bind(fo, std::placeholders::_1); fos(1); } 等於是外面再包一層,但是bind的地方該怎麼寫呢?似乎是不能 std::function<foType> fo2 =std::bind(&foAndFo, std::placeholders::_1); 這樣寫啊 想說一直疊上去結果疊兩層就沒。了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.164.208 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1550844655.A.1EE.html ※ 編輯: gino0717 (123.194.164.208), 02/22/2019 22:11:17
LPH66: 你想像中的"疊 N 層"最後是長怎樣? 02/22 22:28
感覺會出現一堆莫名其妙的東西 我用 auto fo2 =std::bind(&foAndFo, std::placeholders::_1, std::placeholders::_2); 疊到第二層了,然後把auto印出來fo2的type原型是 class std::_Binder<struct std::_Unforced, void(__cdecl*)(class std::function<void __cdecl(int)>, int), struct std::_Ph<1> const &, struct std::_Ph<2> const &> 哇 再往上疊還得了 ※ 編輯: gino0717 (123.194.164.208), 02/22/2019 22:41:48
lingege32: 你最後一個std function內應該是void(fotype)吧? 02/22 23:04
loveme00835: 完全不知道你想幹嘛, 不過 type erasure 這件事情你 02/23 00:01
loveme00835: 是不是想得太複雜惹 02/23 00:02
suhorng: 你 bind 錯東西了, foAndFo 是哪一個函數回傳 void, 不是 02/23 10:35
suhorng: fo 自己啊. 當然最後不能變成 std::function<foType> 02/23 10:35
suhorng: 原本 foo 是 N -> void, f1 只是做 eta-expansion 最後 02/23 10:36
suhorng: 還是 N -> void, 但 foAndFo 就是 (N -> void) -> void了 02/23 10:37
suhorng: fo2 的部分做 eta-expansion 當然得是 (N -> void) -> vo 02/23 10:37
lc85301: 樓上 haskell 語法跑出來了XD 02/23 13:29
LPH66: 這裡可能真的要用這種語法才會知道原 PO 有沒有搞錯什麼 02/23 17:58
LPH66: 我首推其實有點想要原 PO 就用 auto 寫個疊 N 層的樣子出來 02/23 17:59
LPH66: 再來看看到底是不是哪裡搞混了還是怎樣的 02/23 17:59
rareone: Haskell XDDDDDD 03/18 10:58