c++ - 可以使用默认参数复制包含 lambda 的 std::function 吗?

标签 c++ lambda function-pointers std-function default-parameters

有没有什么方法可以从 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);

[Live example]

但是,没有办法得到等同于 f3 = f1 的东西。

关于c++ - 可以使用默认参数复制包含 lambda 的 std::function 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44173953/

相关文章:

C++ 在运行时构建嵌套函数

c++ - 相互递归 lambda

java - Java 8 中的 lambda 表达式是否执行多线程?

c++ - EXPECT_CALL(mock, f(N)) vs f(K) 后跟 f(N)

c++ - 疯狂的 unique_ptr 语法

android - 将数组缩减为单个整数会导致类型错误

c++ - 为 typedef 的函数指针推导模板参数

c++ - 将函数指针转换为 void(*)(),然后重新转换为原始类型

c++ - C++中运算符的函数指针

c++ - 如何将无符号字符数组解析为数值数据