gpt4 book ai didi

rust - 如何通过泛型获取数组结构 (SOA) 中的值?

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

我正在寻找您对一段代码的反馈/建议。

基本上,我有一个像这样的 SOA:

struct Entities {
pub meshes: FakeArena<Mesh>,
pub lights: FakeArena<Light>,
}

我可以通过他的“句柄”访问特定值(每个句柄都绑定(bind)到特定类型),所以我可以通过执行 entities.meshes.get(&handle) 获取网格的值.

到目前为止,还不错,但我正在尝试通过相应的竞技场动态检索值来实现这一点。通过执行 entities.get(&handle) 如果句柄类型是 Mesh,我返回 entities.meshes.get(&handle)。我的 Entities 结构有一个名为 get 的方法:

fn get<T: Any>(&self, handle: &Handle<T>) -> &T {
let mut entity: Option<&dyn Any> = None;
let any = handle as &dyn Any;

any.downcast_ref::<Handle<Mesh>>()
.map(|handle| entity = Some(self.meshes.get(handle) as &dyn Any));

any.downcast_ref::<Handle<Light>>()
.map(|handle| entity = Some(self.lights.get(handle) as &dyn Any));

if entity.is_none() {
panic!("Type not found in stored entites.");
}

entity
.unwrap()
.downcast_ref::<T>()
.expect("Error while downcasting the entity type")
}

Playground

这非常有效。我将通用类型向下转换为具体类型,然后再次转换为通用类型,但这看起来很奇怪而且很棘手。

也许我遗漏了什么,或者您对此有更好的主意;你会怎么办? :)

最佳答案

这里不需要任何动态调度,普通的静态调度就足够了。

创建一个特征,它被赋予对容器结构的引用。每个组件类型都实现这个特征并选择容器的适当字段。然后,在您的 get 方法中要求特征并使用它:

struct Mesh;
struct Light;

struct Entities {
meshes: Vec<Mesh>,
lights: Vec<Light>,
}

trait Example {
fn get_in<'a>(&self, entities: &'a Entities) -> &'a Self;
}

impl Example for Mesh {
fn get_in<'a>(&self, entities: &'a Entities) -> &'a Self {
&entities.meshes[0]
}
}

impl Example for Light {
fn get_in<'a>(&self, entities: &'a Entities) -> &'a Self {
&entities.lights[0]
}
}

impl Entities {
fn get<T: Example>(&self, handle: T) -> &T {
handle.get_in(self)
}
}

fn example(entities: &Entities) {
let m = entities.get(Mesh);
let l = entities.get(Light);
}

关于rust - 如何通过泛型获取数组结构 (SOA) 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58809379/

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