gpt4 book ai didi

rust - 有什么方法可以将 Box> 转换为 Box> 吗?

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

考虑这样的代码:

trait Foo {
fn foo(&self);
}

fn consume_func(b: Box<Box<Foo>>) {
unimplemented!();
}

fn produce_func() -> Box<Box<Foo + Send>> {
unimplemented!();
}

fn main() {
let b = produce_func();
consume_func(b);
}

它不编译:

error[E0308]: mismatched types
--> src/main.rs:24:18
|
24 | consume_func(b);
| ^ expected trait `Foo`, found trait `Foo + std::marker::Send`
|
= note: expected type `std::boxed::Box<std::boxed::Box<Foo + 'static>>`
found type `std::boxed::Box<std::boxed::Box<Foo + std::marker::Send>>`

Boxa way to give a C library a void * pointer from Box<Trait> .由于胖指针,我无法转换 Box<Foo>void * .

我不能改变consume_func ,我宁愿不使用 unsafe或额外分配。

最佳答案

这是一种方法:取消引用 b (将其“拆箱”为 Box<Foo + Send> ),然后立即将其包装在另一个 Box<T> 中,允许编译器推断出正确的 T (在本例中为 Box<Foo>)。

consume_func(Box::new(*b));

这是有效的,因为 Box<Foo + Send>可以自动强制为 Box<Foo> ,但是Box<Box<Foo + Send>>不能强制为 Box<Box<Foo>> .

关于rust - 有什么方法可以将 Box<Box<Foo + Send>> 转换为 Box<Box<Foo>> 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51600230/

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