#traits #cast #derive #dyn

as_base

将 trait 对象转换为某个基类

4 个版本

0.1.3 2023 年 9 月 1 日
0.1.2 2023 年 8 月 31 日
0.1.1 2023 年 8 月 30 日
0.1.0 2023 年 8 月 29 日

#2165Rust 模式

MIT/Apache

5KB
50

as_base

此包允许直接访问类似 C++ 公共基类的 trait 对象内部的字段。不涉及虚拟调度,基类对象始终以与封装对象相同的地址开始。

use as_base::*;

struct BaseType {
    x: u64,
}

trait MyTrait: AsBase<BaseType> {}

#[derive(AsBase)]
#[repr(C)]
struct Implementor {
    pub base: BaseType,
}

impl MyTrait for Implementor {}

fn main() {
    let x = Implementor {
        base: BaseType { x: 42 },
    };
    let dyn_reference = &x as &dyn MyTrait;
    assert_eq!(dyn_reference.as_base().x, 42)
}

依赖关系

~3MB
~57K SLoC