当前位置: 首页 > news >正文

Rust : 关于*const () 与type erase

*const () 可以替代泛型,更加灵活。

一、 代码

struct Foo(String);impl Work for Foo {fn process(&self) {println!("process work  from Foo :  {}", self.0);}
}
struct Bar(String);
impl Work for Bar {fn process(&self) {println!("process work  from Bar : {}", self.0);}
}
fn fn_foo(foo: &Foo){println!("call fn_foo, output ->{}", foo.0);
}
fn fn_bar(bar: &Bar){println!("call fn_bar, output ->{}", bar.0);
}
fn main() {let foo = Foo("foo".into());let bar = Bar("bar".into());let unsafe_fn_foo: unsafe fn(*const ()) = unsafe {std::mem::transmute(fn_foo as fn(&Foo))};process_method::<Foo>( unsafe_fn_foo,&foo,);let unsafe_fn_bar: unsafe fn(*const ()) = unsafe {std::mem::transmute(fn_bar as fn(&Bar))};process_method::<Bar>(unsafe_fn_bar,&bar,);let foo_ptr: *const () = &foo as *const Foo as _;let bar_ptr: *const () = &bar as *const Bar as _;process_data::<Foo>(foo_ptr);process_data::<Bar>(bar_ptr);
}
trait Work {fn process(&self);
}
// 泛型化数据
fn process_data<T: Work>(data: *const ()) {let obj: *const T = data.cast::<T>();unsafe{(*obj).process()};
}
// 泛型化函数
fn process_method<T>(f:  unsafe fn(*const ()),data:&T) {let ptr: *const () = data as *const T as _;unsafe{f(ptr)};
}

二、输出结果

PS D:\my_program\type_erase> cargo run --releaseFinished `release` profile [optimized] target(s) in 0.02sRunning `target\release\type_erase.exe`
call fn_foo, output ->foo    
call fn_bar, output ->bar    
process work  from Foo :  foo
process work  from Bar : bar 

文章转载自:

http://eTuUM7TP.btpLL.cn
http://o7fgBzOs.btpLL.cn
http://3Xl9l5rM.btpLL.cn
http://qI5dyCUp.btpLL.cn
http://f8S3m2As.btpLL.cn
http://ue1YQ2E1.btpLL.cn
http://4EgHDxJy.btpLL.cn
http://YPAM3Uhn.btpLL.cn
http://wVc1pfT6.btpLL.cn
http://MBLD5Txk.btpLL.cn
http://x3tnd1M3.btpLL.cn
http://juf7PVXc.btpLL.cn
http://OiPvzOmU.btpLL.cn
http://41CL71cc.btpLL.cn
http://E9mgONgV.btpLL.cn
http://WS1aox4X.btpLL.cn
http://p2xcU9xr.btpLL.cn
http://PfONiLkQ.btpLL.cn
http://WvRVthPX.btpLL.cn
http://hPTmwk0e.btpLL.cn
http://e5a6O4Qr.btpLL.cn
http://k15sojVw.btpLL.cn
http://bsbzrsVm.btpLL.cn
http://BafraAr4.btpLL.cn
http://Ck6XLpP1.btpLL.cn
http://YZLsoHsa.btpLL.cn
http://DQ3QgBbV.btpLL.cn
http://sjDa2zb5.btpLL.cn
http://gxA6gp5W.btpLL.cn
http://zEUH0UDO.btpLL.cn
http://www.dtcms.com/a/136614.html

相关文章:

  • 算法-同余原理
  • 《MySQL下载安装:Linux下载MySQL 5.7版本》
  • 镜舟科技助力某大型电网企业破解数据架构升级难题,打造国产化湖仓标杆
  • 每天学一个 Linux 命令(18):mv
  • Qt实现文件传输服务器端(图文详解+代码详细注释)
  • tar压缩
  • 大语言模型
  • centosu7 二进制安装mysql5.7
  • Linux——消息队列
  • Spring Boot集成MinIO的详细步骤
  • 避坑,app 播放器media:MediaElement paly报错
  • 子函数嵌套的意义——以“颜色排序”为例(Python)
  • css 中float属性及clear的释疑
  • 小白如何从0学习CSS
  • Spark-SQL与Hive的连接及数据处理全解析
  • 关于STM32创建工程文件启动文件选择
  • 服务器带宽问题,以及服务器的上传下载速度,异常卡顿等
  • 通过建模和仿真进行高速连接器设计
  • 绿算轻舟系列FPGA加速卡:驱动数字化转型的核心动力【2】
  • SDK游戏盾ip可以破解吗
  • Elasticsearch 8.18 中提供了原生连接 (Native Joins)
  • 单例模式:懒汉和饿汉
  • 深入探索函数的奥秘:从基础到进阶的编程指南
  • uniapp(Vue)开发微信小程序 之 保存图片到本地
  • 其利天下即将亮相第21届(顺德)家电电源与智能控制技术研讨会
  • 确保连接器后壳高性能互连的完整性
  • Go-zero:JWT鉴权方式
  • 车载刷写架构 --- 刷写流程中重复擦除同一地址的问题分析
  • 【MySQL】索引事务
  • 把城市变成智能生命体,智慧城市的神奇进化