c++ - 试图从一个带有参数函数的函数返回一个函数
问题描述
我很好奇是否可以在另一个函数中创建一个静态函数,然后返回该静态函数,其中包含一个参数函数。到目前为止,我尝试过的根本不起作用,当我使用原始函数指针时,代码无法编译。
#include <iostream>
#include <functional>
//both do not work but this one doesn't even compile
/*
void (*func(void (*foo)()))()
{
static void (*copy)();
copy = [&]() { foo(); };
return copy;
}
*/
std::function<void(void)> Foo(std::function<void(void)> func)
{
static std::function<void(void)> temp = [&]() { func(); };
return temp;
}
int main()
{
Foo([]() { std::cout << 123 << '\n'; });
}
解决方案
您评论的问题func
是捕获任何内容的 lambda 无法转换为指向函数的指针。Lambda 捕获提供在初始化时保存的数据,以便在调用时使用,而普通 C++ 函数除了传递的参数外没有任何数据。这种能力实际上std::function
是有用的重要原因之一,我们不只是使用函数指针来完成它的工作。std::function
比函数指针更强大。
当然,func
可以改为copy = foo
; 或者只是return foo;
,避免 lambda 问题。
一个问题Foo
是 lambdafunc
通过引用捕获函数参数,然后在Foo
返回并且生命周期func
结束后调用。可能在其捕获范围结束后调用的 lambda 不应该通过引用来捕获它们,并且std::function
是进入那种糟糕情况的一种简单方法。lambda 应该使用[=]
or[func]
代替。
请注意,您的static
内部Foo
与static
实际函数声明的前面不同。它创建temp
了一个函数静态变量,该变量仅在第一次初始化然后保留。如果Foo
第二次使用不同的 lambda 调用,它将返回与第一次相同的内容。如果这不是你想要的,那就放弃它static
。函数/变量的链接在这里不是问题。
Foo
(将 astd::function
放在 lambda 中有点奇怪,std::function
它都直接调用 next ,而不是只使用原始的std::function
。但我假设这只是因为它是一个简化的或仅用于学习的示例。如果 lambda 做了什么额外或不同,这将是一个很好的方法。)
您main
忽略了从Foo
. 也许你的意思是调用什么Foo
返回,
int main()
{
Foo([]() { std::cout << 123 << '\n'; })();
}
推荐阅读
- python - 在 ModelForm 中仅将日期时间字段显示为小时和分钟(不显示日期)
- c# - WPF 将视图模型集合项绑定到没有类名的视图
- javascript - Node 的控制台没有显示所有对象属性……这是预期的行为吗?
- angular - 更改角材料复选框复选标记的颜色
- javascript - 抓取NodeJS时出现分页问题
- matlab - 如何(自动)测量图像中像素缺陷的大小?
- python-3.x - 使用python在Highcharts中添加系列名称时遇到问题
- python - 如何在此代码中生成两次随机数?
- jquery - 如何从 Firebase 中的单个分支获取单个字符串并将其放在 HTML 文本框中并更新它?
- date - 如何使用 NeDB 解决 FeathersJS 前端日期查询