有没有什么方法可以从 lambda 恢复类型信息,默认参数存储在 std::function 中,但其类型中没有这些参数?
std::function<void()> f1 = [](int i = 0){};
std::function<void(int)> f2 = [](int i = 0){};
std::function<void(int)> f3 = f1; // error
std::function<void()> f4 = f2; // error
看看 std::function 的复制构造函数,其他函数类型没有部分模板特化,所以我想这个信息丢失了,这只是你不能将一种类型的函数分配给的情况另一种类型的函数,即使在内部它们都可以调用该函数。这个对吗?是否有任何解决方法来实现这一目标?我正在查看 std::function::target,但没有任何运气,我不是函数类型和指针方面的专家。
附带说明一下,f1(或 lambda)如何绑定(bind)默认参数?
最佳答案
不,那是不可能的,因为默认参数是一组函数声明的属性,而不是函数本身的属性。换句话说,这是完全合法的 C++:
A.cpp
int f(int i = 42);
const int j = f(); // will call f(42)
B.cpp
int f(int i = 314);
const int k = f(); // will call f(314)
F.cpp
int f(int i = 0)
{
return i;
}
const int x = f(); // will call f(0)
这些都可以很好地链接在一起。
这意味着不可能以某种方式从函数中“检索”默认参数。
您可以使用 std::bind
并提供您自己的默认参数来执行与 f4 = f2
等效的操作,如下所示:
std::function<void()> f4 = std::bind(f2, 42);
但是,没有办法得到等同于 f3 = f1
的东西。
关于c++ - 可以使用默认参数复制包含 lambda 的 std::function 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44173953/