capypad
0 Tage Serie
rust / intermediate
Snippet

Const Generics für Null-Kosten-Abstraktion

Const Generics erlauben Compile-Zeit-Konstanten als generische Parameter. Anders als Typparameter, die Typen akzeptieren, akzeptieren Const-Parameter Compile-Zeit-Konstanten wie Integer-Literale. Dies ermöglicht das Erstellen wirklich generischer Container, deren Größe zur Compile-Zeit bestimmt wird, mit null Runtime-Overhead.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Matrix<T, const N: usize, const M: usize> {
data: [[T; M]; N],
}
 
impl<T, const N: usize, const M: usize> Matrix<T, N, M>
where
T: Default + Copy,
{
fn new() -> Self {
Self { data: [[T::default(); M]; N] }
}
}
 
fn main() {
let m: Matrix<i32, 2, 3> = Matrix::new();
println!("Matrix size: {}x{}", 2, 3);
}
Erklärung
1
const N: usize, const M: usize
Deklariert const generische Parameter N und M vom Typ usize für Dimensionen
2
data: [[T; M]; N]
Erstellt ein 2D-Array vom Typ T mit Dimensionen N x M, alles zur Compile-Zeit bekannt
3
where T: Default + Copy,
Erfordert, dass T Default-constructible und Copy für Stack-basierte Speicherung ist
4
[[T::default(); M]; N]
Erstellt Array durch Wiederholen des Default-Werts M mal für N Zeilen
5
let m: Matrix<i32, 2, 3> = Matrix::new();
Erstellt eine 2x3 Matrix mit spezifischen Compile-Zeit-Dimensionen