作者gino0717 (gino0717)
看板C_and_CPP
標題[問題] std::function 可以疊幾層
時間Fri Feb 22 22:10:51 2019
最近在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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1550844655.A.1EE.html
※ 編輯: gino0717 (123.194.164.208), 02/22/2019 22:11:17
1F:推 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
2F:→ lingege32: 你最後一個std function內應該是void(fotype)吧? 02/22 23:04
3F:→ loveme00835: 完全不知道你想幹嘛, 不過 type erasure 這件事情你 02/23 00:01
4F:→ loveme00835: 是不是想得太複雜惹 02/23 00:02
5F:推 suhorng: 你 bind 錯東西了, foAndFo 是哪一個函數回傳 void, 不是 02/23 10:35
6F:→ suhorng: fo 自己啊. 當然最後不能變成 std::function<foType> 02/23 10:35
7F:→ suhorng: 原本 foo 是 N -> void, f1 只是做 eta-expansion 最後 02/23 10:36
8F:→ suhorng: 還是 N -> void, 但 foAndFo 就是 (N -> void) -> void了 02/23 10:37
9F:→ suhorng: fo2 的部分做 eta-expansion 當然得是 (N -> void) -> vo 02/23 10:37
10F:推 lc85301: 樓上 haskell 語法跑出來了XD 02/23 13:29
11F:推 LPH66: 這裡可能真的要用這種語法才會知道原 PO 有沒有搞錯什麼 02/23 17:58
12F:→ LPH66: 我首推其實有點想要原 PO 就用 auto 寫個疊 N 層的樣子出來 02/23 17:59
13F:→ LPH66: 再來看看到底是不是哪裡搞混了還是怎樣的 02/23 17:59
14F:推 rareone: Haskell XDDDDDD 03/18 10:58