[英]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.