尝试 return 一个函数从一个带有参数函数的函数
Trying to return a function from a function with an argument function within it
我很好奇是否有可能在另一个函数中创建一个静态函数,然后 return 该静态函数中有一个参数函数。到目前为止,我尝试过的方法根本不起作用,当我使用原始函数指针时,代码无法编译。
#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
的一个问题是 lambda 通过引用捕获函数参数 func
,然后在 Foo
已经 returned 并且[的生命周期之后被调用=11=]结束了。可能在其捕获范围结束后调用的 lambda 不应该通过引用捕获它们,而 std::function
是进入这种糟糕情况的简单方法。 lambda 应改用 [=]
或 [func]
。
请注意,Foo
中的 static
与实际函数声明前面的 static
不同。它使 temp
成为函数静态变量,仅在第一次初始化然后保留。如果使用不同的 lambda 第二次调用 Foo
,它将 return 与第一次相同。如果这不是您想要的,只需删除 static
。 functions/variables 的链接在这里不是问题。
(有点奇怪 Foo
把一个 std::function
放在一个 std::function
里面的一个 lambda 里面 都只是直接调用下一个,而不是只使用原来的 std::function
。但我假设这只是因为它是一个简化的或仅供学习的示例。如果 lambda 做了一些额外的或不同的事情,这将是一个很好的方法。)
您的 main
忽略了 return 从 Foo
编辑的函数。也许你想用
调用 Foo
returns
int main()
{
Foo([]() { std::cout << 123 << '\n'; })();
}
有效,您永远不会调用函数:
#include <iostream>
#include <functional>
std::function<void(void)> Foo(std::function<void(void)> func)
{
static std::function<void(void)> temp = [&]() { func(); };
return temp;
}
int main()
{
// Notice final `()`
Foo([]() { std::cout << 123 << '\n'; })();
}
但是您是通过引用捕获函数,所以您必须确保捕获器不会比它长寿。
否则你可以复制捕获它。
我很好奇是否有可能在另一个函数中创建一个静态函数,然后 return 该静态函数中有一个参数函数。到目前为止,我尝试过的方法根本不起作用,当我使用原始函数指针时,代码无法编译。
#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
的一个问题是 lambda 通过引用捕获函数参数 func
,然后在 Foo
已经 returned 并且[的生命周期之后被调用=11=]结束了。可能在其捕获范围结束后调用的 lambda 不应该通过引用捕获它们,而 std::function
是进入这种糟糕情况的简单方法。 lambda 应改用 [=]
或 [func]
。
请注意,Foo
中的 static
与实际函数声明前面的 static
不同。它使 temp
成为函数静态变量,仅在第一次初始化然后保留。如果使用不同的 lambda 第二次调用 Foo
,它将 return 与第一次相同。如果这不是您想要的,只需删除 static
。 functions/variables 的链接在这里不是问题。
(有点奇怪 Foo
把一个 std::function
放在一个 std::function
里面的一个 lambda 里面 都只是直接调用下一个,而不是只使用原来的 std::function
。但我假设这只是因为它是一个简化的或仅供学习的示例。如果 lambda 做了一些额外的或不同的事情,这将是一个很好的方法。)
您的 main
忽略了 return 从 Foo
编辑的函数。也许你想用
Foo
returns
int main()
{
Foo([]() { std::cout << 123 << '\n'; })();
}
有效,您永远不会调用函数:
#include <iostream>
#include <functional>
std::function<void(void)> Foo(std::function<void(void)> func)
{
static std::function<void(void)> temp = [&]() { func(); };
return temp;
}
int main()
{
// Notice final `()`
Foo([]() { std::cout << 123 << '\n'; })();
}
但是您是通过引用捕获函数,所以您必须确保捕获器不会比它长寿。 否则你可以复制捕获它。