作者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/cn.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