[问题] 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