#traits #object #pointers #associated #store #multi #casting

multi-trait-object

一种存储具有所有相关特性的对象的类型

5 个版本

0.2.0 2022年3月13日
0.1.3 2022年3月13日
0.1.2 2022年3月13日
0.1.1 2022年3月13日
0.1.0 2022年3月13日

#9 in #casting

每月下载 26
2 个crate中使用 (通过 trait-bound-typemap)

Apache-2.0

18KB
357

多特性对象

此crate提供了一个指针类型,允许将该类型注册的所有特性进行转换。这是通过将每个特性实现的v-table指针和数据指针存储在类型上来实现的。

安全性

根据我的理解,所有不安全的部分都是完全安全的。由于这个crate还处于早期阶段,可能存在一些尚未注意到的副作用。

使用方法

use multi_trait_object::*;
use std::fmt::Debug;

#[derive(Debug)]
struct MyStruct {
     a: u64,
}

trait MyTrait {}
trait MyOtherTrait {}

impl MyTrait for MyStruct{}
impl MyOtherTrait for MyStruct {}

impl_trait_object!(MyStruct, dyn MyTrait, dyn MyOtherTrait, dyn Debug);

fn main() {
    let obj = MyStruct {
        a: 5
    };

    let mto = obj.into_multitrait();

    {
        let debug = mto.downcast_trait::<dyn Debug>().unwrap();
        println!("{:?}", debug);
        let my_trait = mto.downcast_trait::<dyn MyTrait>().unwrap();
    }
    
    let trait_box: Box<dyn MyTrait> = mto.downcast_trait_boxed::<dyn MyTrait>().unwrap();    
}

许可证

Apache-2.0

无运行时依赖