泛型(对标 C++ 模板)

函数、方法、结构体、枚举都可以使用泛型。

Type Annotation

明确指出泛型的类型需要满足什么条件。

函数泛型/函数模板

1
2
fn func<T>(a: T) {
}
1
2
template <typename T>
void function(T a) {}

方法泛型/方法模板

可以包含其他的类型

1
2
3
4
5
impl<T> Point<T> {
fn func<U>(&self) -> &T {
}
}
// 等价于 ......
1
2
3
4
5
template <typename T>
class Point {
template <typename U>
T func() {}
}

const 泛型、模板参数

对应 C++ 中 template <int N> 这样的模板参数。

1
2
fn func<T, const N: usize>
(arr: [T; N]) {}
1
2
template <typename T, size_t N>
void func(std::array<T, N> arr) {}

针对 const 泛型做检查

这个在 C++ 里应该需要使用 require 做检查,我还没有研究过。Rust 里使用 Assert<>: IsTrue 泛型限制即可。

1
2
3
4
5
6
7
fn something<T>(val: T)
where
Assert<{ core::mem::size_of::<T>() < 768 }>: IsTrue,
// ^ 这里是一个 const 表达式,换成其它的 const 表达式也可以
{
//
}

const fn

对应 C++ 的 constexpr,在编译期求值。