Class Generics

1
2
3
struct MyStruct<T> {
value: T,
}

Function Generics

1
2
3
fn function<T>(a: T) {
// ...
}

Method Generics

1
2
3
4
impl<T> Point<T> {
fn func<U>(&self, x: U) -> &T {
}
}

const Generics

1
2
3
fn func<T, const N: usize>(arr: [T; N]) {
// ...
}

const fn

相当于 constexpr 的功能,让编译器尝试在编译期就对表达式进行求值.

1
2
3
4
5
6
7
8
const fn add(a: usize, b: usize) -> usize {
a + b
}
const RESULT: usize = add(5, 10);

fn main() {
println!("The result is: {}", RESULT);
}

编译器对泛型类型作检查、concept

由于 Rust 是 Zero Cost Abstraction,所以编译期检查也是尤为重要的。效果上和 C20 Concept 和 SFINAE 更接近,本质上和 C20 Concept 更相似。C++20 concept 用 requires 对模板类型参数作出一定的限制,而 Rust 中可以使用 Assert<{ ... }>: IsTrue 对模板参数进行检查(类型参数和 const 泛型都可以)。

以下代码就在编译期检查函数类型的大小是否超过 768 字节。

1
2
3
4
5
6
fn something<T>(a: T)
where
Assert<{ core::mem::size_of::<T>() < 768 }>: IsTrue,
{
// ...
}