繁体   English   中英

用具体类型调用通用闭包

[英]Call generic closure with concrete type

是否可以使用带有具体结构的具体类型来调用泛型函数?

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

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 ,该f接受特征Fn的特征对象,该特征对象引用V
  • 只要调用方实现了特征T ,就可以为V选择任何具体类型。

然后该函数的主体说:

  • 哈哈哈,开个玩笑,无论呼叫者选择了什么,我都将使用具体类型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),

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

这可能不完全是您想要的,但是它可以工作:

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

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

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

这导致将foo和bar强制转换为Trait对象,这意味着它将携带vtable指针(可能不理想)。 它使F成为多态调用。

没有有关您的类型的更多信息,很难理解您要执行的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM