gpt4 book ai didi

rust - 将类型之间的关系指定为特征或宏

转载 作者:行者123 更新时间:2023-11-29 08:33:22 25 4
gpt4 key购买 nike

我想做类似下面的工作:

use std::ops::Add;

trait CanBeAdded: Sized where f64: Add<Self> {}

fn add2<X: CanBeAdded>(x: X) {}

fn main() {}

上面编译失败:

error[E0277]: the trait bound `f64: std::ops::Add<X>` is not satisfied
--> src/main.rs:5:1
|
5 | fn add2<X: CanBeAdded>(x: X) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::ops::Add<X>` is not implemented for `f64`
|
= help: consider adding a `where f64: std::ops::Add<X>` bound
= note: required by `CanBeAdded`

Playground link

我试图断言某些 impl 的存在通过特征:即 X: CanBeAdded暗示f64: Add<X> .虽然我可以像这样将边界添加到函数的 where 子句:

fn add2<X>(x: X) where f64: Add<X> { }

我有很多,所以它变得笨重,我不想一遍又一遍地重复边界。这个有好的解决办法吗?例如,是否可以包含一个扩展为一系列 where 的宏?条款?

最佳答案

随机类型 X 实际上不太可能是这样的 f64: Add<X> .

鉴于f64是一个内置的,唯一可以定义 Add 实现的模块对于 f64Add被定义为。我们可以查看 listed implementations here :

  • impl Add<f64> for f64
  • impl<'a> Add<&'a f64> for f64

仅此而已。


不过,如果这就是您想要的,您可以以不同的方式定义特征。

首先,我们定义了一个新的标记特征。它本身非常无趣,因为它完全没有方法:

trait ReverseAdd<T> { type Output; }

然后,我们添加一个整体实现,以自动为任何实现 Add 的类型实现特征,但关系相反:

impl<T, U> ReverseAdd<T> for U where T: Add<U> {
type Output = <T as Add<U>>::Output;
}

最后,我们用它作为我们的界限:

fn add2<X: ReverseAdd<f64>>(x: X) {
}

关于rust - 将类型之间的关系指定为特征或宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com