作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚学习 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());
}
关于c++ - 通过 Rust 中的泛型类型进行编译时算术,类似于 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71758865/
我是一名优秀的程序员,十分优秀!