gpt4 book ai didi

generics - 使用具体类型调用通用闭包

转载 作者:行者123 更新时间:2023-11-29 08:23:48 25 4
gpt4 key购买 nike

是否可以使用具体类型和具体结构调用泛型函数?

这是我想做的一个小例子:

trait T {}
trait T2 {}
struct S1 {}
struct S2 {}
impl T for S1 {}
impl T for S2 {}

fn test<V: T>(foo: &S1, bar: &S2, f: &Fn(&V)) {
f::<S1>(foo);
f(bar);
}

fn main() {
test(&S1{}, &S2{}, &|_| println!("called"));
}

我无法摆脱通用参数 V 因为我要解决的实际问题要复杂得多。此外,我无法创建包装特征,因为有时我的签名很弱,有时 f 需要更多特征。

最佳答案

这是不可能的:

fn test<V: T>(foo: &S1, bar: &S2, f: &Fn(&V)) {
f::<S1>(foo);
}

实际上,函数签名说:

  • 请给我一个 f ,它采用特征 Fn 的特征对象,它引用 V
  • caller 可以为 V 选择任何具体类型,只要它实现了特征 T

然后函数体说:

  • 哈哈哈,开个玩笑,我要用具体类型 S1 调用那个 f,不管调用者选择了什么。

这行不通,因为调用者选择的 V 可能不是 S1。事实上,它很可能不会成为S1

关于我能提供的唯一建议是接受另一个特征对象作为参数:

fn test(foo: &S1, bar: &S2, f: &Fn(&T)) {
f(foo);
f(bar);
}

但是您已经排除了这种可能性,所以...


作为旁注,我不确定您为什么将闭包作为特征对象。通常,我只接受一个通用的:

fn test<F>(foo: &S1, bar: &S2, f: F)
where F: Fn(&T),

这允许发生某种程度的单态化。

关于generics - 使用具体类型调用通用闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43076870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com