gpt4 book ai didi

c++ - 通过 Rust 中的泛型类型进行编译时算术,类似于 C++?

转载 作者:行者123 更新时间:2023-12-05 03:26:19 25 4
gpt4 key购买 nike

我刚刚学习 Rust,想编写使用泛型类型执行编译时算术的代码。

例如,在 C++ 中,我可以编写以下代码 (on Goldbolt):

#include <iostream>

template <int X>
struct Test {
constexpr static int x = X;
};

template <int X1, int X2>
auto operator+(const Test<X1>&, const Test<X2>&) {
return Test<X1 + X2>{};
}

int main() {
const Test<4> a{};
const Test<6> b{};
const auto c = a + b;
std::cout << c.x << '\n'; // prints 10
}

我尝试用 Rust ( on Playground ) 编写类似的代码:

use std::ops::Add;

pub struct Test<const X: u8>;

impl<const X: u8> Test<X> {
pub fn x(&self) -> u8 { X }
}

impl<const X1: u8, const X2: u8> Add<Test<X2>> for Test<X1> {
type Output = Test<{X1 + X2}>;
fn add(self, rhs: Test<X2>) -> Test<{X1 + X2}> {
Test::<{X1 + X2}>{}
}
}

fn main() {
let a: Test<4> = Test{};
let b: Test<6> = Test{};
let c = a + b;
println!("{}", c::x());
}

...但这不会编译,因为常量操作中不能使用通用参数。这种事情用 Rust 根本不可能做到,还是我可以尝试另一种策略?

最佳答案

你可以做到,但是 const 泛型还没有完成,所以它目前需要一个夜间编译器和一个显式启用的功能:

#![feature(generic_const_exprs)]
#![allow(incomplete_features)]

use std::ops::Add;

pub struct Test<const X: u8>;

impl<const X: u8> Test<X> {
pub fn x(&self) -> u8 { X }
}

impl<const X1: u8, const X2: u8> Add<Test<X2>> for Test<X1> where [(); (X1 + X2) as usize]: {
type Output = Test<{X1 + X2}>;
fn add(self, _rhs: Test<X2>) -> Test<{X1 + X2}> {
Test::<{X1 + X2}>{}
}
}

fn main() {
let a: Test<4> = Test{};
let b: Test<6> = Test{};
let c = a + b;
let Test::<10> = c;
println!("{}", c.x());
}

(Permalink to playground)

关于c++ - 通过 Rust 中的泛型类型进行编译时算术,类似于 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71758865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com