Rust中如何指定const泛型参数同时让普通类型参数自动推导
解决方案
Rust 编译器强制泛型参数顺序必须遵循 生命周期参数 → 类型参数 → const 泛型参数 的规则,你调整参数顺序触发的提示翻译如下:
帮助提示:请重新排列泛型参数顺序:生命周期参数在前,接下来是类型参数,最后是 const 泛型参数
你可以选择以下两种方案实现需求,不需要手动指定类型参数 T:
方法1:使用_占位符让编译器自动推导类型
无需修改原函数定义,仅在调用时用_代替需要自动推导的类型参数即可,是成本最低的方案:
fn func_with_const_if<T, const ENABLED: bool>(val: &T) where T: std::fmt::Debug { if ENABLED { println!("val: {:?}", val); } } pub fn main() { let val: i32 = 5; // _ 占位表示T的类型由编译器根据传入的val自动推导 func_with_const_if::<_, true>(&val); }
方法2:封装const参数为零大小标记类型
如果觉得每次调用写_不够简洁,可以把const参数封装为零大小的标记类型作为入参,调用时无需写任何泛型参数,且零大小类型不会产生任何运行时开销:
// 定义两个零大小标记类型对应开关状态 struct Enabled; struct Disabled; trait IsEnabled { const ENABLED: bool; } impl IsEnabled for Enabled { const ENABLED: bool = true; } impl IsEnabled for Disabled { const ENABLED: bool = false; } // 标记类型E属于类型参数,放到T前面符合编译器泛型顺序要求 fn func_with_const_if<T, E: IsEnabled>(_enabled_flag: E, val: &T) where T: std::fmt::Debug { if E::ENABLED { println!("val: {:?}", val); } } pub fn main() { let val: i32 = 5; // 直接传标记指定开关状态,T的类型完全自动推导 func_with_const_if(Enabled, &val); }
内容的提问来源于stack exchange,提问作者Lucas Wilson
相关产品推荐
相关产品推荐

