作者:
gino0717 (gino0717)
2019-02-22 22:10:51最近在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);
這樣寫啊
想說一直疊上去結果疊兩層就沒。了
作者:
LPH66 (-6.2598534e+18f)
2019-02-22 22:28:00你想像中的"疊 N 層"最後是長怎樣?
作者: lingege32 (MUDA) 2019-02-22 23:04:00
你最後一個std function內應該是void(fotype)吧?
完全不知道你想幹嘛, 不過 type erasure 這件事情你是不是想得太複雜惹
作者:
suhorng ( )
2019-02-23 10:35:00你 bind 錯東西了, foAndFo 是哪一個函數回傳 void, 不是fo 自己啊. 當然最後不能變成 std::function<foType>原本 foo 是 N -> void, f1 只是做 eta-expansion 最後還是 N -> void, 但 foAndFo 就是 (N -> void) -> void了fo2 的部分做 eta-expansion 當然得是 (N -> void) -> vo
作者:
lc85301 (pomelocandy)
2019-02-23 13:29:00樓上 haskell 語法跑出來了XD
作者:
LPH66 (-6.2598534e+18f)
2019-02-23 17:58:00這裡可能真的要用這種語法才會知道原 PO 有沒有搞錯什麼我首推其實有點想要原 PO 就用 auto 寫個疊 N 層的樣子出來再來看看到底是不是哪裡搞混了還是怎樣的
作者:
rareone (拍玄)
2019-03-18 10:58:00Haskell XDDDDDD