rust 实现模板化结构的Default,其中唯一的区别是模板化变量

jc3wubiy  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(188)

在定义了一个长度模板化的矩阵后,我可以更容易地控制大小:

pub struct SquareMatrix<const length: usize> {
    data: [[f32; length]; length],
}

我为矩阵定义了默认函数:

impl Default for SquareMatrix<2> {
    fn default() -> Self {
        return SquareMatrix {
            data: [[0.0; 2];2],
        }
    }
}

impl Default for SquareMatrix<3> {
    fn default() -> Self {
        return SquareMatrix {
            data: [[0.0; 3];3],
        }
    }
}

impl Default for SquareMatrix<4> {
    fn default() -> Self {
        return SquareMatrix {
            data: [[0.0; 4];4],
        }
    }
}

它看起来并不优雅,因为它们的唯一区别是模板的长度。但是当我取出length并只定义一个模板函数时:

impl Default for SquareMatrix<length> {
        fn default() -> Self {
        return SquareMatrix {
            data: [[0.0; length]; length],
        }
    }
}

错误提示:length not found in this scope
有没有一种方法可以为模板结构定义一个模板函数?

k2arahey

k2arahey1#

你很接近了,你只需要在Default实现中定义泛型:

#[derive(Debug)]
pub struct SquareMatrix<const LENGTH: usize> {
    data: [[f32; LENGTH]; LENGTH],
}

impl<const LENGTH: usize> Default for SquareMatrix<LENGTH> {
    fn default() -> Self {
        return SquareMatrix {
            data: [[0.0; LENGTH]; LENGTH],
        };
    }
}

fn main() {
    let matrix: SquareMatrix<2> = Default::default();

    println!("{:?}", matrix);
}
SquareMatrix { data: [[0.0, 0.0], [0.0, 0.0]] }

另外,minor nitpick:const泛型应该全部大写。

相关问题