[問題] std::function 可以疊幾層

看板C_and_CPP作者 (gino0717)時間6年前發表 (2019/02/22 14:10), 6年前編輯推噓5(509)
留言14則, 6人參與, 6年前最新討論串1/1
最近在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

02/22 22:28, 6年前 , 1F
你想像中的"疊 N 層"最後是長怎樣?
02/22 22:28, 1F
感覺會出現一堆莫名其妙的東西 我用 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

02/22 23:04, 6年前 , 2F
你最後一個std function內應該是void(fotype)吧?
02/22 23:04, 2F

02/23 00:01, 6年前 , 3F
完全不知道你想幹嘛, 不過 type erasure 這件事情你
02/23 00:01, 3F

02/23 00:02, 6年前 , 4F
是不是想得太複雜惹
02/23 00:02, 4F

02/23 10:35, 6年前 , 5F
你 bind 錯東西了, foAndFo 是哪一個函數回傳 void, 不是
02/23 10:35, 5F

02/23 10:35, 6年前 , 6F
fo 自己啊. 當然最後不能變成 std::function<foType>
02/23 10:35, 6F

02/23 10:36, 6年前 , 7F
原本 foo 是 N -> void, f1 只是做 eta-expansion 最後
02/23 10:36, 7F

02/23 10:37, 6年前 , 8F
還是 N -> void, 但 foAndFo 就是 (N -> void) -> void了
02/23 10:37, 8F

02/23 10:37, 6年前 , 9F
fo2 的部分做 eta-expansion 當然得是 (N -> void) -> vo
02/23 10:37, 9F

02/23 13:29, 6年前 , 10F
樓上 haskell 語法跑出來了XD
02/23 13:29, 10F

02/23 17:58, 6年前 , 11F
這裡可能真的要用這種語法才會知道原 PO 有沒有搞錯什麼
02/23 17:58, 11F

02/23 17:59, 6年前 , 12F
我首推其實有點想要原 PO 就用 auto 寫個疊 N 層的樣子出來
02/23 17:59, 12F

02/23 17:59, 6年前 , 13F
再來看看到底是不是哪裡搞混了還是怎樣的
02/23 17:59, 13F

03/18 10:58, 6年前 , 14F
Haskell XDDDDDD
03/18 10:58, 14F
文章代碼(AID): #1SS0Bl7k (C_and_CPP)