递归火山软件开发平台

标题: 基于go的协程, 想到的视窗对匿名函数的支持 [打印本页]

作者: hcwanz    时间: 2024-6-25 08:58
标题: 基于go的协程, 想到的视窗对匿名函数的支持
(, 下载次数: 37)
(, 下载次数: 37) (, 下载次数: 38)


作者: 沉默流星    时间: 2024-6-25 10:04
支持
作者: cloud261    时间: 2024-6-25 18:01
用嵌入式方法可以封装std::function, 问题是怎么优雅的实现闭包函数的传参和返回值

作者: Xelloss0618    时间: 2024-6-25 18:15
std::function<void()> 不难封装,std::bind 就完事,难的是带参数和返回值的,没有优雅的写法。
简单的匿名函数现在也不难写,不需要加那个 @视窗.前缀文本 "//",但带参数的匿名函数,我想不到能如何封装。
作者: hcwanz    时间: 2024-6-25 18:26
本帖最后由 hcwanz 于 2024-6-25 18:29 编辑
Xelloss0618 发表于 2024-6-25 18:15
std::function 不难封装,std::bind 就完事,难的是带参数和返回值的,没有优雅的写法。
简单的匿名函数现 ...

参数好像奇怪的能用
(, 下载次数: 28)


作者: cloud261    时间: 2024-6-25 20:31
hcwanz 发表于 2024-6-25 18:26
参数好像奇怪的能用

比如js数组map函数那种, 接受一个参数,返回一个值, 怎么优雅的实现
我看标准库用的类似“取循环索引”这种方式来取c++端的参数
返回的话,估计实现起来也差不多,  比如 “设置结果(123)”

都很丑陋
作者: Xelloss0618    时间: 2024-6-25 20:33
hcwanz 发表于 2024-6-25 18:26
参数好像奇怪的能用

你这 c、d 是靠 [&] 捕获进来,而不是传参。
作者: hcwanz    时间: 2024-6-25 20:38
本帖最后由 hcwanz 于 2024-6-25 20:48 编辑
Xelloss0618 发表于 2024-6-25 20:33
你这 c、d 是靠 [&] 捕获进来,而不是传参。

是传参.
(, 下载次数: 37)
作者: hcwanz    时间: 2024-6-25 20:41
cloud261 发表于 2024-6-25 20:31
比如js数组map函数那种, 接受一个参数,返回一个值, 怎么优雅的实现
我看标准库用的类似“取循环索引”这 ...

标准库的命名都是详细大过书写的, 点名就是文本型和字节集类的相关方法, 两个字的事情,能写出一大串
作者: Xelloss0618    时间: 2024-6-25 20:51
hcwanz 发表于 2024-6-25 20:38
是传参.

(, 下载次数: 41)

明显不是参数,而是通过 [&] 俘获了匿名函数外部的变量

作者: hcwanz    时间: 2024-6-25 20:53
本帖最后由 hcwanz 于 2024-6-25 20:55 编辑
Xelloss0618 发表于 2024-6-25 20:51
明显不是参数,而是通过 [&] 俘获了匿名函数外部的变量

那为啥我这输出的是未修改的?
(, 下载次数: 25)
作者: hcwanz    时间: 2024-6-25 20:56
本帖最后由 hcwanz 于 2024-6-25 21:01 编辑
Xelloss0618 发表于 2024-6-25 20:51
明显不是参数,而是通过 [&] 俘获了匿名函数外部的变量

你这光写的捕获吧, 我这是传了参数的 (, 下载次数: 27)

作者: Xelloss0618    时间: 2024-6-25 21:13
hcwanz 发表于 2024-6-25 20:56
你这光写的捕获吧, 我这是传了参数的

你改成 嵌入 (a, "", c, d) 就知道了
即空俘获 [] (int& c, int & d) {}
作者: hcwanz    时间: 2024-6-25 21:16
Xelloss0618 发表于 2024-6-25 21:13
你改成 嵌入 (a, "", c, d) 就知道了
即空俘获 [] (int& c, int & d) {}

好像没啥问题吧
(, 下载次数: 27)

作者: hcwanz    时间: 2024-6-25 21:20
本帖最后由 hcwanz 于 2024-6-25 21:33 编辑
Xelloss0618 发表于 2024-6-25 21:13
你改成 嵌入 (a, "", c, d) 就知道了
即空俘获 [] (int& c, int & d) {}

匿名函数应该会优先使用内部的变量, 当找不到对应的变量名的时候, 才会去捕获
这里我把 '参数d' 打错成 '参数b' 了,
然后 '函数a'  修改的是 '参数c' 和捕获的 '变量d' ;
(, 下载次数: 24)
int c=1,d=2;
auto a=[&](auto c,auto b){
DebugTrace (FALSE, 0, 0, L"nnn",c,d,2);
c=19;d=49;
DebugTrace (FALSE, 0, 0, L"nnn",c,d,3);
};

DebugTrace (FALSE, 0, 0, L"nnn",c,d,1);
a(8,3);
DebugTrace (FALSE, 0, 0, L"nnn",c,d,4);






作者: Xelloss0618    时间: 2024-6-25 21:34
好吧,搞明白了,你这是将匿名函数的参数名,跟外部变量设置成一样。




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4