Rust 中的 const generics

一、含义

常量泛型:使用常量值来当作泛型参数(ie. 100a),而不是使用类型(ie. i32char

二、使用场景

在大多数需要使用数组类型却不知道其大小,Rust中的数组类型为 [T; N]T为元素的类型,N为大小),在编译期间就需要指定数组的大小,如果一个函数的参数类型为数组,没有常量泛型,就需要给同类型而大小不一的数组设置不同的参数

三、当前限制

  1. 整型、charbool(浮点型、自定义类型不行)
  2. 只能单独使用泛型常量参数
  3. 常量表达式,用{}包裹,不能有泛型参数
// 常量表达式需要指定类型
fn foo<const N: usize>() {}

fn bar<T, const M: usize>(array: [T; M]) {
    foo::<M>(); // ok: `M` 是单独一个泛型常量参数
    foo::<2021>(); // ok: `2021` 是一个常量
    foo::<{20 * 100 + 20 * 10 + 1}>(); // ok: 可以在编译期间计算的常量表达式,而且没有泛型参数
    
    foo::<{ M + 1 }>(); // error: 不是单独一个常量参数 `M`
    foo::<{ std::mem::size_of::<T>() }>(); // error: 常量表达式包含泛型参数 `T`
    
    let _: [u8; M]; // ok: `M` 是一个常量参数
    let _: [u8; std::mem::size_of::<T>()]; // error: 常量表达式包含泛型参数 `T`
}

fn main(){
    let arr1 = [0; 50];
    let arr2 = ['a'; 10];
    
    // 使用常量泛型函数
    bar(arr1);
    bar(arr2);
}

参考内容

【1】Const generics MVP hits beta!

posted @ 2023-02-19 20:42  ~哥斯拉~  阅读(160)  评论(0)    收藏  举报