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

作者: 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)吧?
作者: loveme00835 (髮箍)   2019-02-23 00:01:00
完全不知道你想幹嘛, 不過 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:00
Haskell XDDDDDD

Links booklink

Contact Us: admin [ a t ] ucptt.com