我正在尝试在Rust中用整数溢出相加两个数字。我正在尝试使用模板,因此数字类型应该是可配置的。然后,我将溢出操作移交给Wrapping结构。这是代码:
// T: Copy + Add + Sub + Default + From<u8> + Into<char> + UpperHex
pub fn inc_value(&mut self, value: T) {
self.buffer[self.index] = (Wrapping(self.buffer[self.index]) + Wrapping(value)).0;
}
可悲的是,这会导致编译错误,因为(当然)并非总是为T实现Wrapping。可悲的是,Wrapping似乎没有使用任何特征,而是为某些值实现了。
如何限制T通过包装实现?还是有更好的方法来归档我的总体目标?
这是我得到的编译器错误:
error[E0369]: binary operation `+` cannot be applied to type `std::num::Wrapping<T>`
--> src\buffer.rs:28:70
|
28 | self.buffer[self.index] = (Wrapping(self.buffer[self.index]) + Wrapping(value)).0;
| --------------------------------- ^ --------------- std::num::Wrapping<T>
| |
| std::num::Wrapping<T>
|
= note: an implementation of `std::ops::Add` might be missing for `std::num::Wrapping<T>`
最佳答案
错误消息中的注释会告诉您该怎么做。您需要添加约束:
where
Wrapping<T>: Add,
关于generics - 限制可包装使用的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59696332/