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

Rust : 关于*const () 与type erase

*const () 可以替代泛型,更加灵活。下面举了两个完全不一样的数据结构Foo和Bar;以及不同的函数,来说明。

一、 代码


trait Work {fn process(&self);
}
struct Foo(String);impl Work for Foo {fn process(&self) {println!("process work  from Foo : {}", self.0);}
}
struct Bar{code:String,open:f64,high:f64,low:f64,close:f64,
}
impl Bar{fn new(code:String,open:f64,high:f64,low:f64,close:f64)->Self{Self{code,open,high,low,close,}}
}
impl Work for Bar {fn process(&self) {println!("process work  from Bar : {}", self.code);}
}
fn fn_foo(foo: &Foo){println!("call fn_foo, output ->{}", foo.0);
}
fn fn_bar(bar: &Bar){println!("call fn_bar, output ->code:{} open:{} high:{} close:{} low:{},", bar.code,bar.open,bar.high,bar.close,bar.low);
}
fn main() {let foo = Foo("foo".into());let bar = Bar::new("600036.SH".into(),36.9,37.8,36.7,36.4);let unsafe_fn_foo: unsafe fn(*const ()) = fn_const_ptr(fn_foo as fn(&Foo));process_method::<Foo>( unsafe_fn_foo,&foo);let unsafe_fn_bar: unsafe fn(*const ()) = fn_const_ptr(fn_bar as fn(&Bar));process_method::<Bar>(unsafe_fn_bar,&bar);let foo_ptr: *const () = data_const_ptr(&foo);let bar_ptr: *const () = data_const_ptr(&bar);process_data::<Foo>(foo_ptr);process_data::<Bar>(bar_ptr);
}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 _; // 这里"_"type eraseunsafe{f(ptr)};
}
fn data_const_ptr<T>(data: &T) -> *const () {data as *const T as _ // 这里"_"type erase
}
fn fn_const_ptr<T>(f: fn(&T)) -> unsafe fn(*const ()) {unsafe {std::mem::transmute(f)}
}

二、输出结果

   Compiling type_erase v0.1.0 (D:\my_program\type_erase)Finished `release` profile [optimized] target(s) in 2.08sRunning `target\release\type_erase.exe`
call fn_foo, output ->foo
call fn_bar, output ->code:600036.SH open:36.9 high:37.8 close:36.4 low:36.7,
process work  from Foo : foo
process work  from Bar : 600036.SH

http://www.mrgr.cn/news/98693.html

相关文章:

  • ReportLab 导出 PDF(图文表格)
  • 21天Python计划:零障碍学语法(更新完毕)
  • OSPF综合实验
  • Oracle 中的 NOAUDIT CREATE SESSION 命令详解
  • 双指针算法(一)
  • GR00T N1:面向通用类人机器人的开放基础模型
  • 一天时间,我用AI(deepseek)做了一个配色网站
  • Leetcode 325. 和等于 k 的最长子数组长度【Plus题】
  • PyTorch - Tensor 学习笔记
  • 【前端】Vue一本通 ESLint JSX
  • Vue3+Vite+TypeScript+Element Plus开发-17.Tags-组件构建
  • 解决Flutter 2.10.5在升级Xcode 16后的各种报错
  • Maven 多仓库与镜像配置全攻略:从原理到企业级实践
  • 解决 Vue 中 `v-model` 获取不到值的问题:一步步排查与解决方案
  • TMS320F28P550SJ9学习笔记16:Lin通信SCI模式配置TX发送结构体寄存器
  • 如何利用GM DC Monitor快速监控一台网络类设备
  • CompletableFuture
  • HOW - 前端 sdk 实践(二)- 权限 SDK
  • 算法基础(以acwing讲述顺序为主,结合自己理解,持续更新中...)
  • 数据结构与算法入门 Day 0:程序世界的基石与密码