如何实现 returns 泛型受整数类型约束的函数?

How can I implement a function that returns a generic constrained by an integral type?

如何实现如下函数,其中 T 是整数类型?

fn get_vec<T>() -> Vec<T>
{
    let vec: Vec<T> = Vec::new();
    let n: i32 = 5;
    let n_as_t = n as T;
    vec.push(n_as_t);
    vec
}

问题是泛型在扩展之前进行了类型检查;这意味着编译器必须验证 n as T(其中 n 是一个 i32)对于所有可能的 T 都有效。不是。

想要的是使用特征将T限制为可以从i32转换的类型。有点可悲的是,这种特质并不存在。

最接近的模拟可能是 std::convert::From,但它没有实现此类基本转换,您不能自己提供它们。曾经有一些处理转换 to/from 原始整数类型的特征,但我相信它们在 1.0 清理之前被删除了。

在这一点上,你基本上是靠自己了。您需要滚动表示此转换的特征,然后为您关心的类型实现它。因此,您可以使用如下特征:

trait FromI32 {
    fn from_i32(v: i32) -> Self;
}

然后将函数更改为使用 <T: FromI32>FromI32::from_i32(n) 而不是 n as T

如果要实现所述特征的类型不止几种,一个简单的宏应该可以减少重复。