【发布时间】:2021-04-20 16:02:23
【问题描述】:
考虑一下这个 C++ 代码:
#include <iostream>
#include <functional>
using namespace std;
std::function<int(int, int)> foo(int c) {
auto add = [] (int a, int b) { return a + b; };
auto sub = [] (int a, int b) { return a - b; };
if (c > 42) {
return add;
} else {
return sub;
}
}
int main() {
cout << foo(100)(10, 20) << '\n';
}
两个 lambda(add 和 sub)都通过 std::function 进行类型擦除,然后在 main 中调用该函数。
我想知道如何在 rust 中复制这种模式?
【问题讨论】:
-
我不确定我是否理解“通过
std::function擦除类型”的意思。add和sub是通用的,但从foo返回的std::function仅适用于ints。被擦除的类型是std::function中包含的 lambda 的类型,是你的意思吗? -
@largest_prime_is_463035818 让我稍微澄清一下这个问题。我已经删除了 auto 并明确了类型。是的,这就是我的意思。每个 lambda 都是不同的类型,但是当我们分配给 std::function 时,我们已经有效地删除了该类型。 (std::function 在其实现中通过虚方法实现)