gpt4 book ai didi

types - 可以访问结构成员的 'TypeId' 吗?

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

有没有办法访问TypeId ( std::any::TypeId::of::<T> ) 结构成员的名称?

如果我有一个基本结构:

MyStruct {
value: i64,
}

而我只知道MyStructvalue , 有没有办法访问 TypeId::of::<i64> - 哪里i64取决于 value 的类型?

main () {
assert_eq!(
TypeId::of::<i64>,
// ^^^ this works
type_id_of!(MyStruct, value),
// ^^^ this is what I'm looking for
);
}

参见相关问题:Is it possible to access the type of a struct member for function signatures or declarations?

最佳答案

您可以使用类型检测来推断您拥有的值的任何字段的 TypeId,只要它是 'static(其他 TypeId::of 不起作用):

fn type_id<T: 'static + ?Sized>(_: &T) -> TypeId {
TypeId::of::<T>()
}

fn main() {
let m = MyStruct { value: 4 };
println!("{:?} {:?}", TypeId::of::<i64>(), type_id(&m.value));
}

然后,利用 offsetof 中的策略你问的问题,你可以创建一个宏来从没有实例的类型中获取它:

macro_rules! type_id_of {
($t:ty, $f:ident) => {
{
fn type_of<T: 'static + ?Sized>(_: &T) -> TypeId {
TypeId::of::<T>()
}
let base: $t = unsafe { ::std::mem::uninitialized() };
let result = type_of(&base.$f);
::std::mem::forget(base);
result
}
}
}

fn main() {
println!("{:?} {:?}", TypeId::of::<i64>(), type_id_of!(MyStruct, value));
}

关于types - 可以访问结构成员的 'TypeId' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42111590/

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