我试图在 Rust 过程宏(派生宏)内的编译时计算一组常量的最大值。
该宏看起来像:
fn get_max_len() -> TokenStream {
// Each TokenStream represents a constant expression
let len: Vec<TokenStream> = get_constant_lengths();
quote! {
// #(#len),* gets expanded to #len[0], #len[1], #len[2]...
const LEN: usize = std::cmp::max(#(#len),*);
}
}
问题是std::cmp::max
是一个函数,因此不能在常量表达式中使用(至少直到const fn
是稳定的 - 如果可能的话,我想保持稳定的 Rust)。
如何在编译时计算一组常量的最大值?
我也许可以写一个max!
宏基本上构建了一个巨大的链if
递归地,但我希望有一个更干净的解决方案。
虽然持续评估不支持if
或其他控制流,有一种方法可以根据二进制条件选择值:
[a, b][(a < b) as usize]
这是做什么的
- 创建一个包含您要在其中进行选择的两个元素的数组
- 创建任意布尔表达式
- 将所述表达式转换为
usize
- 使用该值对上面创建的数组进行索引
如果条件是,则选择第一个元素false
,如果条件是,则选择第二个元素true
.
虽然该方案理论上可以通过对多个类型进行数学运算计算索引来扩展到任意长度的数组bool
s,采用函数式方式并嵌套上述表达式似乎更简单:
const fn max(a: usize, b: usize) -> usize {
[a, b][(a < b) as usize]
}
const MAX: usize = max(max(max(5, 6), 42), 3);
从 Rust 1.31 开始,const fn
可在稳定编译器上使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)